我将一堆键值对作为参数传递给XSL(日期 - >“1月20日”,作者 - >“Dominic Rodger”,......)。
这些在我正在解析的XML中被引用 - XML看起来像这样:
<element datasource="date" />
目前,除了一个可怕的<xsl:choose>
陈述之外,我无法弄清楚如何将1月20日从这些中删除:
<xsl:template match="element">
<xsl:choose>
<xsl:when test="@datasource = 'author'">
<xsl:value-of select="$author" />
</xsl:when>
<xsl:when test="@datasource = 'date'">
<xsl:value-of select="$date" />
</xsl:when>
...
</xsl:choose>
</xsl:template>
我想使用类似的东西:
<xsl:template match="element">
<xsl:value-of select="${@datasource}" />
</xsl:template>
但我怀疑这是不可能的。我打算使用外部函数调用,但希望避免在我的XSL中枚举所有可能的映射键。有什么想法吗?
谢谢,
的Dom
答案 0 :(得分:2)
以下是一种可能的解决方案,但我建议将所有参数分组到单独的XML文件中,并使用document()
函数访问它们:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
exclude-result-prefixes="ext"
>
<xsl:output method="text"/>
<xsl:param name="date" select="'01-15-2009'"/>
<xsl:param name="author" select="'Dominic Rodger'"/>
<xsl:param name="place" select="'Hawaii'"/>
<xsl:param name="time" select="'midnight'"/>
<xsl:variable name="vrtfParams">
<date><xsl:value-of select="$date"/></date>
<author><xsl:value-of select="$author"/></author>
<place><xsl:value-of select="$place"/></place>
<time><xsl:value-of select="$time"/></time>
</xsl:variable>
<xsl:variable name="vParams" select="ext:node-set($vrtfParams)"/>
<xsl:template match="element">
<xsl:value-of select=
"concat('
', @datasource, ' = ',
$vParams/*[name() = current()/@datasource]
)"
/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档:
<data>
<element datasource="date" />
<element datasource="place" />
</data>
产生了正确的结果:
date = 01-15-2009
地点=夏威夷
请注意使用xxx:node-set()
函数(此处使用the EXSLT one)将RTF(Result Tree Fragment)转换为常规xml文档(临时树)。
答案 1 :(得分:0)
如果@datasource始终与参数名称匹配,则可以尝试“evaluate”函数。注意:此代码未经测试。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exslt-dynamic="http://exslt.org/dynamic"
>
<xsl:param name="date"/>
<xsl:template match="element">
<xsl:value-of select="exslt-dynamic:evaluate('$' + @datasource)"/>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:-2)
怎么样
<xsl:template match="date-element">
<xsl:text>${date}</xsl:text>
</xsl:template>
即。而不是使用属性,匹配使用不同的元素名称。
如果无法更改源XML,请通过将属性转换为正确元素名称的小型XSLT运行它。
另一种解决方案是将xsl:param元素放入不同的XML文档中(或尝试使XSLT模板再次自行读取)。然后你可以使用xsl:key和key()来引用它们。
[编辑]用xsl:text替换xsl:value-of。我没有方便的XSLT工具,所以我无法测试这个。如果这不起作用,请发表评论。