我是xml和xsl的新手,如果这是一个简单的问题,如果我的术语不正确,我很抱歉。
我的问题是,“ab”和“cd”属于元素,但是在xsl中,xpath表达式“../ text()”始终指向“ab”,但不是“cd”。 有什么方法可以得到“CD”吗?非常感谢!
的xml:
<root>
ab
<CH>xxxx</CH>
cd
<CH>xxxx</CH>
</root>
的xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root" >
<xsl:apply-templates select="CH"/>
</xsl:template>
<xsl:template match="CH" >
<c>
<xsl:value-of select="../text()"/>
</c>
</xsl:template>
</xsl:stylesheet>
目前的结果:
<?xml version="1.0"?>
<c>
ab
</c><c>
ab
</c>
欲望结果:
<?xml version="1.0"?>
<c>
ab
</c><c>
cd
</c>
<root>
ab
<CH>xxxx</CH>
cd
<CH>xxxx</CH>
</root>
current result: <c>ab</c><c>ab</c>
desire result: <c>ab</c><c>cd</c>
答案 0 :(得分:1)
看起来您正在寻找preceding-sibling
轴。
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root" >
<xsl:apply-templates select="CH"/>
</xsl:template>
<xsl:template match="CH" >
<c>
<xsl:value-of select="preceding-sibling::text()[1]"/>
</c>
</xsl:template>
</xsl:stylesheet>
输出:
<c> ab
</c><c> cd
</c>
答案 1 :(得分:0)
../text()
返回两个文本节点,这两个节点是父节点的子节点。
<xsl:value-of select="../text()" />
隐式添加了[1]
来将select语句过滤到select语句中的第一项。有很多种方法可以选择合适的文本节点,使用preceding-sibling::
,如Alejandro建议的那样可能是最适合您的问题的方法,但另一种解决方案可以让您更清楚地了解当前../text()
表达式的情况将模板更改为:
<xsl:template match="CH" >
<xsl:variable name="position" select="position()"/>
<c>
<xsl:value-of select="../text()[$position]"/>
</c>
</xsl:template>
答案 2 :(得分:0)
<?xml version="1.0"?><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root">
<xsl:apply-templates select ="CH"/>
</xsl:template>
<xsl:template match="CH" >
<c><xsl:value-of select="preceding-sibling::text()[1]"/>
</c>
</xsl:template>
尼克·琼斯提到,我们也可以使用“前兄弟”来解决问题,我只是在这里发帖,以防任何人感兴趣。