我想在select关键字中使用一个属性。
这是我的xml
<root rowselement="root/a/b">
<a>
<b var="target1"/>
</a>
<a>
<b var="target2"/>
</a>
和xslt
<xsl:for-each select="/root/@rowselement">
<xsl:value-of select="@var"/>
</xsl:for-each>
和预期产出
Target1时 TARGET2
但它不起作用,我该怎么办?
答案 0 :(得分:1)
该属性包含一个字符串,您希望将该字符串解释为XPath表达式,并评估该表达式。这通常称为“动态评估” - 评估直到运行时才知道的XPath表达式。
许多XSLT处理器都具有能够执行此操作的扩展功能 - 有些使用EXSLT扩展dyn:eval() - 但它因处理器而异。
在你使用提供xsl:evaluate指令的XSLT 3.0之前,W3C标准中没有任何内容可以启用它。
答案 1 :(得分:1)
试试这个:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="root">
<xsl:for-each select="descendant::*/@var">
<xsl:value-of select="."/><xsl:if test="following::*/@var"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:1)
问题定义不够好,恕我直言:XPath表达式可能比您的示例显示的要复杂得多。
如果你的表达总是那么简单,你可以通过做类似下面的例子来解决这个问题:
测试输入
<root rowselement="/root/a/b">
<a>
<a var="target0"/>
<b var="target1"/>
</a>
<b>
<a var="target4"/>
<b var="target5"/>
</b>
<a>
<b var="target2"/>
<b var="target3"/>
</a>
</root>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:variable name="path" select="/root/@rowselement" />
<xsl:template match="*">
<xsl:variable name="path-to-me">
<xsl:for-each select="ancestor-or-self::*">
<xsl:value-of select="concat('/', name())"/>
</xsl:for-each>
</xsl:variable>
<xsl:if test="$path-to-me = $path">
<xsl:value-of select="@var"/>
<xsl:text> </xsl:text>
</xsl:if>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
<强>结果强>
target1
target2
target3
请注意,在我的示例中,给定的路径表达式以根节点/
开头。