我正在尝试将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文件中获取数据?
如果这不可能,是否有可行的替代方法可以使用(我尝试研究具有XSVLT列名称的XSLT变量,并根据名称,种类动态地引用了该变量像Perl引用或PHP中的$$,但找不到我可以实现的任何东西)?
相似的问题并未完全回答我的问题: XSLT document with dynamic path; dynamic xpath in xslt?; Reference an XSLT variable via a dynamic name
编辑:我无法确定是否有任何扩展名。
答案 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怪癖)。而不是尝试从当前样式表中获取它。然后,您可以遍历此变量的内容。