【发布时间】: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>
</xsl:text></xsl:variable>
<xsl:variable name="seperatorPipe"><xsl:text>|</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 文件中获取数据?
如果这不可能,是否有可行的替代方法(我尝试研究具有 XSV 列名称的 XSLT 变量,并研究根据名称动态引用变量,种类像 Perl 引用或 PHP 中的 $$,但没有找到我可以实现的任何东西)?
没有完全回答我的问题的类似问题: XSLT document with dynamic path ; dynamic xpath in xslt? ; Reference an XSLT variable via a dynamic name
编辑:我无法确定是否有任何扩展可用。
【问题讨论】: