将两个节点合并为一个节点,从一个节点获取值,从其他节点获取名称

时间:2013-06-23 00:35:03

标签: xslt

我想要转换节点,如:

<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具有为简单转换进行自我记录的附加价值。

1 个答案:

答案 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>指令。