尝试将属性解释为XPath

时间:2018-08-01 16:25:36

标签: xml xslt xpath xslt-1.0

我正在尝试将XML文件转换为CSV文件。生成的CSV文件将包含2行,第一行是列标题,第二行是从XML文件提取的数据。

在回答问题Reference an XSLT variable via a dynamic name之后,我创建了一个类似的结构。但是,我希望元素包含2个属性,第一个是要使用的列的名称(第一行),第二个是要求值的XML路径(第二行)提取值。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<message>
    <address>
        <line-1>123 Random Street</line-1>
        <line-2>Random-City, Some-State</line-2>
    </address>
</message>

XSLT:               

<!-- Global variables -->
    <xsl:variable name="newlineChar"><xsl:text>&#xa;</xsl:text></xsl:variable>
    <xsl:variable name="seperatorPipe"><xsl:text>&#x7C;</xsl:text></xsl:variable>

    <v:variables name="varsRaw">
        <v:variable name="ADDRESS_LINE_1" value="//message/address/line-1" />
        <v:variable name="ADDRESS_LINE_2" value="//message/address/line-2" />
    </v:variables>
    <xsl:variable name="vars" select="document('')//v:variables/v:variable" />

<!-- Start main template -->
    <xsl:template match="/|@*">

        <!-- CSV Column headers -->
        <xsl:for-each select="$vars">
            <xsl:value-of select="./@name" />
            <xsl:if test="position() != last()">
                <xsl:value-of select="$seperatorPipe" />
            </xsl:if>
        </xsl:for-each>

        <!-- CSV Column values -->
        <xsl:for-each select="$vars">
            <xsl:value-of select="./@value" />
            <xsl:if test="position() != last()">
                <xsl:value-of select="$seperatorPipe" />
            </xsl:if>
        </xsl:for-each>

    </xsl:template>
<!-- End main template -->

</xsl:stylesheet>

第一个for-each可以正常工作,根据需要显示标题。

但是,我无法获得XSLT来将value属性的内容解释为XPath,而是将其处理并显示为文字字符串。我尝试将其括在大括号(<xsl:value-of select="{./@value}" />)中,但这并没有改变任何内容(我推测这是因为它不是XSLT变量)。

是否可以让XSLT将元素或属性的内容解释为XPath以便从XML文件中获取数据?

如果这不可能,是否有可行的替代方法可以使用(我尝试研究具有XSVLT列名称的XSLT变量,并根据名称,种类动态地引用了该变量像Perl引用或PHP中的$$,但找不到我可以实现的任何东西)?

相似的问题并未完全回答我的问题: XSLT document with dynamic path; dynamic xpath in xslt?; Reference an XSLT variable via a dynamic name

编辑:我无法确定是否有任何扩展名。

2 个答案:

答案 0 :(得分:0)

  

是否有可能让XSLT将元素或属性的内容解释为XPath以便从XML文件中获取数据?

原始XSLT / XPath 1.0或2.0中没有动态的XPath评估。

您可以使用特定于XSLT处理器的扩展来克服这一问题,例如http://exslt.org/dyn/functions/evaluate/

您的XSL处理器支持哪种扩展(如果有),取决于。

XSLT 3.0具有<xsl:evaluate>spec)。

答案 1 :(得分:0)

我可以在这里看到两个问题。

首先,您可能的意思是:

<v:variables name="varsRaw">
    <v:variable name="ADDRESS_LINE_1" value="{//message/address/line-1}" />
    <v:variable name="ADDRESS_LINE_2" value="{//message/address/line-2}" />
</v:variables>

这是您要解释XPath的地方。

第二,我将其放入变量中,并使用EXSLT将其转换为from result fragment to node set(XSLT 1.0怪癖)。而不是尝试从当前样式表中获取它。然后,您可以遍历此变量的内容。