在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),但我很难在变量内容上实现相同的目标。 非常感谢。
答案 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="..."
永远定义的变量包含实际节点,但始终是结果树片段(基本上您可以将其视为字符串)。