Xml 如何将XSLT属性用于每个select

Xml 如何将XSLT属性用于每个select,xml,xslt,xslt-1.0,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="@v

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

预期产量

目标1 目标2


但它不起作用,我能做什么?

属性包含一个字符串,您希望将该字符串解释为XPath表达式,并对该表达式求值。这通常被称为“动态评估”——评估直到运行时才知道的XPath表达式

许多XSLT处理器都有一个扩展函数可以做到这一点——有些使用EXSLT扩展dyn:eval()——但它因处理器而异

在使用XSLT 3.0之前,W3C标准中没有任何内容可以启用此功能,XSLT 3.0提供了xsl:evaluate指令。

尝试以下方法:

<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>

, 

问题的定义不够好,IMHO: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>
target1
target2
target3

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

开始。您能给我一个示例或教程链接吗?您使用的是什么XSLT处理器?我不知道该处理器,因此无法告诉您它实现了什么。dyn:evaluate在那个页面上被描述,声称libxslt实现了它,这可能就是您正在使用的。我相信他们希望使用
root/@rowselement
中的路径来控制选择哪些元素作为输出。这是一个很好的建议,还有一个。
target1
target2
target3