如何在xslt中逐字复制xml节点
我主要逐字复制大量XML节点,其中xxx代表一些不感兴趣的名称,如何简化XSLT如何在xslt中逐字复制xml节点,xml,xslt,Xml,Xslt,我主要逐字复制大量XML节点,其中xxx代表一些不感兴趣的名称,如何简化XSLT <xsl:template match="xxx"> <zzz> <wrapper1> <!-- verbatim copying of content of existing wrapper tag which is a list of codes -->
<xsl:template match="xxx">
<zzz>
<wrapper1>
<!-- verbatim copying of content of existing wrapper tag
which is a list of codes -->
<xsl:for-each select="wrapper1/code">
<code>
<xsl:value-of select="."/>
</code>
</xsl:for-each>
</wrapper1>
<wrapper2>
<!-- lots of verbatim copying of xml tags
to the added wrapper tag -->
<city>
<xsl:value-of select="city"/>
</city>
<state>
<xsl:value-of select="state"/>
</state>
<postalCode>
<xsl:value-of select="postalCode"/>
</postalCode>
<country>
<xsl:value-of select="country"/>
</country>
<!-- etc etc -->
</wrapper2>
</zzz>
</xsl:template>
与此类似,但缺少地址字段的包装器标记:
<xxx>
<wrapper1>
<code>001</code>
<!-- more codes may be present, hence xsl:for-each -->
</wrapper1>
<wrapper2> <!-- wrapper added by xslt -->
<city>Amsterdam</city>
<state>NH</state>
<postalCode>1234AA</postalCode>
<country>Holland</country>
</wrapper2>
</xxx>
所有这些包装器标记的目的是,它可以编写一个XSD模式,来自Microsoft SDK的XSD.exe可以使用它来创建C#类,以便与数据库表格式很好地匹配,这样我就不必在C#类中写入所有这些字段名
我发现xslt语法很棘手,尽管我成功地使上述内容真正起作用,但我想xslt中仍然有一些智能功能可以使事情更好地工作。我想您只是想
<xsl:template match="xxx">
<zzz>
<xsl:copy-of select="wrapper1"/>
<wrapper2>
<xsl:copy-of select="* except wrapper1"/>
</wrapper2>
</zzz>
</xsl:template>
它逐层递归复制节点,并使用模板覆盖它,以便进行所需的更改(例如在您的案例中)
<xsl:template match="xxx">
<zzz>
<xsl:apply-templates select="wrapper1"/>
<wrapper2>
<xsl:apply-templates select="*[not(self::wrapper1)]"/>
</wrapper2>
</zzz>
</xsl:template>
尽管Martin的答案更为复杂,但基于他对以下内容的解释,我已经非常满意这个解决方案:
<xsl:template match="xxx">
<zzz>
<xsl:copy-of select="wrapper1" />
<wrapper2>
<xsl:copy-of select="city" />
<xsl:copy-of select="state" />
<xsl:copy-of select="postalCode" />
<xsl:copy-of select="country" />
</wrapper2>
</zzz>
</xsl:template>
对于几十个字段,Martin的解决方案会更好,但实际上我有大约15个字段
在使用诸如C#xslt.transform之类的microsoft工具时,我最好坚持使用XSLT1.0的基本功能。另外,我还称自己是xml新手,这更容易理解
不管怎样,谢谢你,马丁+1那么输入XML的外观如何?您是否不知道
?你知道身份转换是大多数XML-to-XML转换的基础吗?你想复制、更改和/或删除一些东西吗?@MartinHonnen输入XML添加了,是的,我听说过xsl:copy,但在谷歌上搜索时,我没有找到帮助我理解它的东西来帮助解决我的问题。另外,wrapper1的技巧也不错,但是对于city、state等字段的技巧更受欢迎,因为我们的表有很多字段。我使用Microsoft的XslCompiledTransform,它是XSLT 1.0处理器,但我也会尝试您的XPath1选项。我猜语法将允许排除更复杂的输入xml的两个包装器。我也很高兴每个字段都能被复制,比如:xsl:copy of select=“country”,虽然不太复杂,但已经比我原来的xsltI好得多。我真的很喜欢你的帮助,希望有一天我能达到掌握和使用xslt 2的成熟度,我对你的答案投了赞成票,但作为旁注,我不想做任何复制。如果我在一个遥远的国家的同事们只是自己放入包装器元素,我根本不需要做任何xslt。使用直接复制来删除我的原始代码的2/3,而且非常容易阅读和自我解释,所以在这个场合我将坚持使用它。
<xsl:template match="xxx">
<zzz>
<xsl:apply-templates select="wrapper1"/>
<wrapper2>
<xsl:apply-templates select="*[not(self::wrapper1)]"/>
</wrapper2>
</zzz>
</xsl:template>
<xsl:template match="xxx">
<zzz>
<xsl:copy-of select="wrapper1" />
<wrapper2>
<xsl:copy-of select="city" />
<xsl:copy-of select="state" />
<xsl:copy-of select="postalCode" />
<xsl:copy-of select="country" />
</wrapper2>
</zzz>
</xsl:template>