【问题标题】:Copy node and add value to attribute with Xslt使用 Xslt 复制节点并为属性添加值
【发布时间】:2013-12-03 15:24:09
【问题描述】:

基本上,我遇到了 xml 和 xslt 的问题,我不知道如何解决,希望从哪里开始就此事提供任何帮助。我有 XML:

<root>
 <test value="1" setting="3">
   <tag1>data....</tag1>
   <tag2>data....</tag2>
   <tag n+1>data....</tag n+1>
 </test>
 <test value ...
 .
 .
 .
 </test>
</root>

现在我需要以这种方式复制“测试”节点中的所有节点,并始终将值 3 添加到 4 个新节点中的设置值(测试节点中的设置值正在更改),如下所示,所以我会得到:

<root>
 <test value="2" setting="6">
   <ni1 name="1" setting1="6">data....</ni1>
   <ni2 name="1" setting1="6">data....</ni2>
   <ni3 name="1" setting1="6">data....</ni3>
   <ni4 name="1" setting1="6">data....</ni4>
   <tag1>data....</tag1>
   <tag2>data....</tag2>
   <tag n+1>data....</tag n+1>
 </test>
 <test value ...
 .
 .
 .
 </test>
</root>

非常感谢您对此事的任何帮助, 伊奥格拉西

【问题讨论】:

  • 您在过去几天/几周内提出了许多非常相似的问题,例如“我想按原样复制大部分输入 XML,但添加/删除/修改某些特定的其中的节点”,答案始终是相同的 - 从标识模板开始,然后为要更改的位提供特定模板。这里也是如此,所以我相信你可以自己解决这个问题。
  • 如果您遇到 特定 问题,那么请务必发布一个问题,包括您迄今为止尝试过的 XSLT 以及输入的(格式正确的)示例和您需要的输出,我们可以帮助您调试它,但是一个又一个的问题,如果您没有提供任何证据证明您自己已经做出任何努力的问题开始变得乏味......
  • @Ian,我刚开始学习如何使用 Xslt 以及首先使用它有什么可能。我总是研究如何做某事,但是当我遇到困难时,我会在 stackoverflow 上寻求帮助,因为你们对我帮助很大。如果您是管理员,请随时删除您认为不符合 stackoverflow 的所有帖子 - 我不介意。还是谢谢。

标签: xslt copy add nodes


【解决方案1】:

正如 cmets 中提到的,identity transform 是您在转换 XML 并且只想对 XML 的某些部分进行更改时需要的东西

<xsl:template match="@*|node()">
   <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>

您说您想要“始终将值 3 添加到设置”,因此您将拥有一个与 settings 属性匹配的模板。

<xsl:template match="test/@setting">

(在这种情况下,它只会匹配属于 test 元素的 settings 属性。)

然后在这个模板中,你使用 xsl:attribute 来输出一个新的属性,而不是使用相同的名称但修改了值

<xsl:attribute name="setting">
  <xsl:value-of select="number(.) + 3" />
</xsl:attribute>

你说你还想复制 test 节点下的 4 个节点。这意味着您需要一个模板来匹配 test 节点,因为这是添加子节点所需要的转换

<xsl:template match="test">
   <xsl:copy>
     <xsl:apply-templates select="@*" />
     <!-- Add new nodes here -->
     <xsl:apply-templates select="node()"/>
   </xsl:copy>
</xsl:template>

不清楚新节点的数据来自哪里,所以你必须自己做,但看起来 setting 属性来自 setting测试元素上的 strong> 属性。因此,您的代码可能如下所示:

<ni1 name="1" setting1="{number(@setting) + 3}">data....</ni1>

注意此处使用属性值模板。花括号{ } 表示要计算的表达式,而不是字面输出。

试试这个 XSLT 作为示例。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="test/@setting">
    <xsl:attribute name="setting">
      <xsl:value-of select="number(.) + 3" />
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="test">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <ni1 name="1" setting1="{number(@setting) + 3}">data....</ni1>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 2015-07-31
  • 2017-09-10
  • 2021-06-17
  • 2012-08-03
  • 1970-01-01
相关资源
最近更新 更多