我想要转换节点,如:
<Element>
<Type>Type1</Type>
<Quantity>q1</Quantity>
</Element>
(类型节点值来自枚举)到:
<Element>
<Type1>q1</Type1>
</Element>
仅在两个节点都存在的情况下。否则,如果节点<Quantity>
不存在,而是存在节点<LastDate>
,那么此节点:
<Element>
<Type>Date</Type>
<LastDate>date string</LastDate>
</Element>
变为:
<Element>
<Date>date string</Date>
</Element>
因此,新节点的名称始终取自<Type>
节点的值,但其值可能来自父<Element>
节点的不同子节点(如果存在)。包含值的子节点将在最终输出中与<Type>
节点一起删除。
我在Linq to XML C#代码中执行此操作没有任何问题。但是,由于这种转换可以应用于几个不同的节点,输入到我的程序的命令行,指定哪些节点受影响以及如何变得复杂。
相比之下,xslt具有为简单转换进行自我记录的附加价值。
答案 0 :(得分:3)
使用<xsl:element>
凭空创建元素。
所以你需要类似的东西(没有测试错别字):
<xsl:template match="Element">
<xsl:copy>
<xsl:element name="{Type}">
<xsl:copy-of select="(Quantity|LastDate)/node()"/>
</xsl:element>
</xsl:copy>
</xsl:template>
此代码复制<Element>
元素,然后使用子元素<Type>
的内容名称凭空创建子元素。
括号括号的使用是一个属性值模板,其中的XPath地址被评估为<xsl:value-of>
指令。