1

我想像这样转换节点:

<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>node的值,但它的值可能来自父<Element>节点的不同子节点(当它们存在时)。包含该值的子节点与该<Type>节点一起在最终输出中被删除。

我在 Linq to XML C# 代码中这样做没有问题。但是,由于这种转换可以应用于几个不同的节点,因此我的程序的命令行输入,指定哪些节点受到影响以及如何受到影响,变得复杂。

相比之下,xslt 具有为简单转换进行自我记录的附加价值。

4

1 回答 1

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>指令一样被评估。

于 2013-06-23T00:58:32.567 回答