我不明白为什么我的元素内容没有被复制?
即。我的xml当前输出如下所示
<root>
<foo>some content</foo>
<set>
<set-element>
<set-key>some-key</set-key>
<set-val/>
</set-element>
</set>
</root>
所以这个想法是我想把元素中的东西复制到元素中。预期的输出应该是
<root>
<foo>some content</foo>
<set>
<set-element>
<set-key>some-key</set-key>
<set-val>some content</set-val>
</set-element>
</set>
</root>
我的xsl模板看起来像这样
<axsl:template match="set">
<axsl:copy>
<axsl:apply-templates select="@*|node()"/>
<set-element>
<set-key>some-key</set-key>
<set-val><axsl:value-of select="foo"/></set-val>
</set-element>
</axsl:copy>
</axsl:template>
我尝试了很多东西:
<value><axsl:value-of select="root/foo"/></value>
<value><axsl:value-of select="root/foo/text()"/></value>
<value><axsl:value-of select="foo/text()"/></value>
<value><axsl:value-of select="foo/*"/></value>
我已经尝试将foo元素中的whats保存为参数,然后在value中使用该参数:但仍然没有成功 任何人都能看到我模板的问题吗?
修改
如果我的集合中有多个set-elements,即
,该怎么办?<root>
<foo>some content</foo>
<set>
<set-element>
<set-key>some-key</set-key>
<set-val>some content</set-val>
</set-element>
<set-element>
<set-key>some-key-2</set-key>
<set-val>some content-2</set-val>
</set-element>
<set-element>
<set-key>some-key-3</set-key>
<set-val/>
</set-element>
</set>
</root>
我想将<foo>
内容添加到第3个元素?
据我所知,这将要求<xsl:template match=value>
有一些参数来指定要修改的值?
答案 0 :(得分:2)
您的方法存在的问题是 context 。 XPath表达式可以是相对的,它们的分辨率取决于您在XML树中的确切位置。
换句话说,如果您的模板与set
匹配,则以下行:
<axsl:value-of select="foo"/>
检索set
的子节点,其元素名称为“foo”。 (但是,当然,这个子节点不存在。)
要查找与上下文无关的节点,请在表达式中使用//
。但我建议您不要使用它,只要您可以从上下文中引用节点,例如通过像preceding-sibling
这样的轴。
样式表(已修改)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="set-val[preceding-sibling::set-key='some-key-3']">
<xsl:copy>
<xsl:value-of select="parent::set-element/parent::set/preceding-sibling::foo[1]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出(已修改)
<?xml version="1.0" encoding="UTF-8"?>
<root>
<foo>foo content</foo>
<set>
<set-element>
<set-key>some-key</set-key>
<set-val>some content</set-val>
</set-element>
<set-element>
<set-key>some-key-2</set-key>
<set-val>some content-2</set-val>
</set-element>
<set-element>
<set-key>some-key-3</set-key>
<set-val>foo content</set-val>
</set-element>
</set>
</root>
请注意,我已更改您的输入。 foo
的文字内容现在是“foo content”。