如何使用变量选择路径?

时间:2014-06-05 08:55:12

标签: variables xslt xpath

我尝试用这种方式在其他Document上选择一个值,但它不起作用。我没有正确的道路。有什么问题?

<xsl:template match="//element[@type='champ']/propriete[2]/text()">

    <xsl:variable name="chemin_data" select="." />

    <xsl:value-of select="document('data_rapport.xml')/$chemin_data"/> 

</xsl:template>

data_rapport.xml

<data>
    <client>value </client>
    <renseignement>
        <projet>  value </projet>
        <utilisateur> value <utilisateur>
    </renseignement>
</data>

$chemin_data包含类似“data/client

的路径

并为每个champ/propriete[2]我努力获得良好的价值。

2 个答案:

答案 0 :(得分:0)

我不认为使用变量来构建XPath是一条你想要走的道路。您可以访问documet()中的节点,就好像它是一个节点一样。

XML data_rapport.xml

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <client>clientValue </client>
    <renseignement>
        <projet>  value </projet>
        <utilisateur> value </utilisateur>
    </renseignement>
</data>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
    <xsl:value-of select="document('data_rapport.xml')/data/client"/>
</xsl:template>
</xsl:stylesheet>

输出

<?xml version="1.0" encoding="utf-8"?>clientValue 

答案 1 :(得分:0)

使用动态XPath需要EXSLT - 动态http://www.exslt.org/dyn/functions/evaluate/

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:dyn="http://exslt.org/dynamic"
                extension-element-prefixes="dyn">

    <xsl:template match="/">
        <xsl:variable name="chemin_data" select="'data/client'" />
        <xsl:variable name="data_rapport" select="document('data_rapport.xml')" />
        <xsl:value-of select="dyn:evaluate(concat('$data_rapport', '/', $chemin_data))"/>
    </xsl:template>

</xsl:stylesheet>

此解决方案需要记住以下几点:

  • 它要求您的XSLT处理器支持EXSLT - 动态(参见文档)
  • 您的动态xpath必须写为字符串 - 否则您已经创建了一个节点集
  • 由于创建动态XPath所需的字符串连接,我在文档中使用了另一个变量
  • 当然:你应该尽可能地避免这种情况,因为它相当脆弱并且会降低性能,所以只有在必要时才使用它