セルフクロージングノードとXMLでペア空のノードを置き換えますように(私はすべての空のノード開閉ペアを交換したいと思います私はこのようになりその一部がいくつかのXML、持って
<BasicInfo>
<Foo>80</Foo>
<Bar>
</Bar>
</BasicInfo>
を<Bar>
上記の)単一自己終了ノードと、このような何か与える:
<BasicInfo>
<Foo>80</Foo>
<Bar />
</BasicInfo>
私はXMLで、2が等価であることを知っているのとXSLTは、それがそうで出力空のノードに望んでいるとどのように選択しますが、ということ私は多くの空のノードと2つの予想されるファイルサイズの違いがあります解釈は心配する価値があるほど十分です。私はxmlを可能な限り効率的に保存したいと思います。 「XSI:nilを」
上記のSQL Serverからの作成されたXMLは、すべて削除され、別のXSLTで変換後のSQL値とのxmlns宣言Server 2008には、取り残さ:それはこのスタイルシートです
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="*">
<xsl:element name="{local-name(.)}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
<xsl:template match="@*[local-name(.)='noNamespaceSchemaLocation']" />
<xsl:template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" match="@xsi:nil" />
</xsl:stylesheet>
こと後ろに開いていると閉じてペアを残して - それは自己閉鎖ノードの後ろに残すように強制する任意の方法は、または独自の新しい効果を生成するために新しいxsltを作ることですか?悲しいことに、ノードを削除
はオプションではありません。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<!--Remove all the empty nodes-->
<!--copy nodes-->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<!--match only those with no contents at all-->
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']" />
<!--now check all those that have existing but empty children and don't return the children if they are empty-->
<xsl:template match="*">
<xsl:copy>
<xsl:if test="descendant::text()">
<xsl:apply-templates select="node()" />
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
しかし、これは私が持っている最も近いです。私はこの質問をしている他の人を見つけましたが、xsltの知識が乏しいということは、私のニーズに応じたソリューションを変更するのに問題があることを意味します(上記のものを整理するのは非常に時間がかかりました!それは、正規化 - 空間の線に沿った何かが行く方法だと思われますか?私は本当にいくつかの助けに感謝します!
NB。 xmlはSQL Server 2008 R2によって生成され、FOR XML PATH
を使用し、XSLTスクリプトはサーバーのxml列に格納されます。オペランドタイプXSLTを持つSSIS 2008のXMLタスクが変換を適用します。
があなたのコントロール下にこのXMLを作成しますか? – Shnugo
はい、SQL Serverを使用していることに注意してください。 –
' 'それを行う必要があります。 'XSLCompiledTransform'を使用して変換を実行していますか?スタイルシートで定義した出力設定を使用するには、 'XmlWriter'に対して' XSLCompiledTransform.OutputSettings'を 'XmlWriter.Create'に渡す必要があります。 –