XSLT将属性添加到变量中的元素

时间:2014-03-12 10:23:03

标签: xml xslt xslt-1.0

在XSLT 1.0中,我有一个带有一些XML节点的变量:

<xsl:varible name="MyVariable">
   <SomeElement>text here</SomeElement>
   <SomeElement>text with <OtherElement>other element</OtherElement></SomeElement>
   <SomeElement>something else <DoNotAddAnything>...</DoNotAddAnything></SomeElement>
</xsl:variable>

我需要为元素SomeElement和OtherElement添加一些具有某些值的属性(但不能添加到其他元素)。我需要将变量的内容转换为这样的内容:

   <SomeElement NewAttribute="x">text here</SomeElement>
   <SomeElement NewAttribute="x">text with <OtherElement OtherAttribute="y">other element</OtherElement></SomeElement>
   <SomeElement NewAttribute="x">something else <DoNotAddAnything>...</DoNotAddAnything></SomeElement>

这是较大转换的一部分,我只需要对变量的内容执行此操作,而不是对XSLT转换的整个输入执行此操作。我找到了转换整个输入的简单解决方案(xsl:apply-template),但我很难在变量内容上实现相同的目标。 非常感谢。

1 个答案:

答案 0 :(得分:1)

  

在XSLT 1.0中,我有一个带有一些XML节点的变量:

这是一种误解。您有一个带有结果树片段的变量,它与“某些XML节点”严格不同。

您必须将结果树片段转换回实际的XML节点。使用vanilla XSLT 1.0这是不可能的,但许多XSLT处理器都有一个名为node-set()的扩展函数。如何启用该功能取决于您的特定XSLT处理器。

<xsl:apply-templates select="exslt:node-set($MyVariable)" />

<xsl:template match="SomeElement">
  <xsl:copy>
    <xsl:copy-of select="@*" />
    <xsl:attribute name="NewAttribute">x</xsl:attribute>
    <xsl:copy-of select="node()" />
  <xsl:copy>
</xsl:template>

也就是说,我试图使用带有“某些XML节点”的变量,这让我很奇怪。除了非常特殊的情况,你不应该这样做,所以我认为你可能做错了。


请注意

<xsl:variable name="foo" select="/some/xml/nodes" />

包含结果树片段,但是包含普通节点集。

但是,未通过select="..." 永远定义的变量包含实际节点,但始终是结果树片段(基本上您可以将其视为字符串)。