【问题标题】:XSLT - add attribute to node dynamicallyXSLT - 动态地将属性添加到节点
【发布时间】:2015-07-16 14:38:50
【问题描述】:

我有如下的xml,

<doc>
<p type="Foot">
    <link ref="http://www.facebook.com">
        <c type="Hyperlink">www.facebook.com</c>
    </link>
</p>
 <p type="End">
    <link ref="http://www.google.com">
        <c type="Hyperlink">www.google.com.com</c>
    </link>
</p>
</doc>

我需要做的是向&lt;p&gt; 节点添加动态id 属性,该节点具有"Foot""End" 属性。所以我写了以下xsl,

<xsl:template match="p[@type='Foot' or @type='End']" priority="1">
     <xsl:copy>
        <xsl:attribute name="id">
            <xsl:value-of select="'foot-'"/> 
            <xsl:number count="p[@type='Foot' or @type='End']" level="any"/>
        </xsl:attribute>
        <xsl:next-match/>
    </xsl:copy>
    </xsl:template>

它给了我以下结果

<doc>
<p id="foot-1"><p type="Foot">
    <link ref="http://www.facebook.com">
        <c type="Hyperlink">www.facebook.com</c>
    </link>
</p></p>
 <p id="foot-2"><p type="End">
    <link ref="http://www.google.com">
        <c type="Hyperlink">www.google.com.com</c>
    </link>
</p></p>
</doc>

和上面的结果xml一样,它添加了重复

节点并添加新属性。但我需要的是这个,

<doc>
<p id="foot-1 type="Foot">
    <link ref="http://www.facebook.com">
        <c type="Hyperlink">www.facebook.com</c>
    </link>
</p></p>
 <p id="foot-2 type="End">
    <link ref="http://www.google.com">
        <c type="Hyperlink">www.google.com.com</c>
    </link>
</p></p>
</doc>

如何通过更改 mu xsl 获得此输出?

【问题讨论】:

  • 我没试过,但我认为你需要 copy-of 来复制你的属性,然后 apply-templates 而不是 next-match 以避免重新处理同一个节点。
  • @Giles,我为 这些转换不起作用。这些仅在我使用 时才有效。

标签: xml xslt xslt-2.0


【解决方案1】:

我认为您的问题可能是我们无法从您的问题中看到的问题 - 您正在调用 xsl:next-match,模板中已经从 xsl:copy 指令输出了 p 标记。如果下一场比赛,无论发生什么,xsl:copy,你都会在第一场比赛中得到第二个p标签,就像你看到的那样。

听起来你需要做的是有另一个更高优先级的模板只匹配p,让它执行&lt;xsl:copy&gt;,在里面调用&lt;xsl:next-match&gt;,然后处理子节点,然后从中删除&lt;xsl:copy&gt;匹配特定案例的低优先级模板。

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

<xsl:template match="p[@type='Foot']" priority="1">
  <xsl:attribute name="id">
    <xsl:value-of select="'foot-'"/> 
    <xsl:number count="p[@type='Foot' or @type='End']" level="any"/>
  </xsl:attribute>
  <xsl:next-match/>
</xsl:template>

etc..

顺便说一句,您不需要&lt;xsl:value-of select="'foot-'"/&gt;- 如果它只是一个常数,那么&lt;xsl:text&gt;foot-&lt;/xsl:text&gt; 就可以了。

【讨论】:

  • 感谢您的评论。 :) 事情是我为 那些转换不起作用。这些仅在我使用 时才有效。
  • 在可能的解决方案中添加了此附加信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2012-08-03
  • 2011-09-04
  • 1970-01-01
相关资源
最近更新 更多