如何为每个选择使用XSLT属性

时间:2015-07-09 08:31:18

标签: xml xslt xslt-1.0

我想在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

但它不起作用,我该怎么办?

3 个答案:

答案 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>&#10;</xsl:text>
    </xsl:if>
    <xsl:apply-templates select="*"/>
</xsl:template>

</xsl:stylesheet>

<强>结果

target1
target2
target3

请注意,在我的示例中,给定的路径表达式以根节点/开头。