Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 将两个节点合并为一个,从一个节点获取值,从另一个节点获取名称_Xslt - Fatal编程技术网

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

Xslt 将两个节点合并为一个,从一个节点获取值,从另一个节点获取名称,xslt,Xslt,我希望像这样变换节点: <Element> <Type>Type1</Type> <Quantity>q1</Quantity> </Element> 类型1 q1 (类型节点值来自枚举)输入到: q1 仅在两个节点都存在的情况下。否则,如果节点不存在,但节点存在,则此节点: <Element> <Type>Date</Type> <Last

我希望像这样变换节点:

<Element>
      <Type>Type1</Type>
      <Quantity>q1</Quantity>
</Element>

类型1
q1
(类型节点值来自枚举)输入到:


q1
仅在两个节点都存在的情况下。否则,如果节点
不存在,但节点
存在,则此节点:

<Element>
  <Type>Date</Type>
  <LastDate>date string</LastDate>
</Element>

日期
日期字符串
变成:

<Element>
  <Date>date string</Date>
</Element>

日期字符串
因此,新节点的名称始终取自
节点的值,但其值可能来自父
节点的不同子节点(如果存在)。包含该值的子节点在最终输出中与
节点一起被删除

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

相比之下,xslt的附加值是为简单的转换进行自文档化。

使用
凭空创建元素

所以你需要这样的东西(没有测试打字错误):


此代码复制
元素,然后使用子元素
内容的名称从无到有地创建子元素


大括号的使用是一个属性值模板,其中的XPath地址的计算方法类似于
指令

工作如预期,并将接受它作为一个答案。我只是需要一点额外的帮助,关于我在OP中没有提到的细节。元素节点有其他节点,应该被保留下来。好的,找到了。只需要添加一个额外的copy语句:
,但想知道是否可以复制元素的所有其他子节点,而不显式地枚举它们。在XSLT 1中,
将复制所有子节点,除了在self::axis上找到给定元素的子节点之外(也就是说,它们是给定元素之一)。在XSLT2中,这要容易得多:
<Element>
  <Date>date string</Date>
</Element>
  <xsl:template match="Element">
    <xsl:copy>
      <xsl:element name="{Type}">
        <xsl:copy-of select="(Quantity|LastDate)/node()"/>
      </xsl:element>
    </xsl:copy>
  </xsl:template>