【问题标题】:Trying to interpret attribute as XPath试图将属性解释为 XPath
【发布时间】:2018-08-01 16:25:35
【问题描述】:

我正在尝试将 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,而是将其处理并显示为文字字符串。我尝试将它括在大括号 (&lt;xsl:value-of select="{./@value}" /&gt;) 中,但这并没有改变任何东西(我推测这是因为它不是 XSLT 变量)。

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

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

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

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

【问题讨论】:

    标签: xml xslt xpath xslt-1.0


    【解决方案1】:

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

    vanilla XSLT / XPath 1.0 或 2.0 中没有动态 XPath 评估。

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

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

    XSLT 3.0 有 &lt;xsl:evaluate&gt; (spec)。

    【讨论】:

    • There is no dynamic XPath evaluation in vanilla XSLT / XPath 1.0 or 2.0. 这证实了我的想法:(谢谢。
    【解决方案2】:

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

    首先,你的意思可能是:

    <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 怪癖)。而不是试图从当前样式表中获取它。然后就可以遍历这个变量的内容了。

    【讨论】:

    • {//message/address/line-1} 将仅返回第一个匹配节点的文本值,因此不起作用。
    • @Tomalak 您可以通过 for-each 迭代所有地址,为每一行生成 v:variable。所有这些都在 xsl:variable 中
    • 首先,这不是&lt;xsl:variable&gt;
    • @Tomalak 把它放在 xsl:variable 里面。
    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多