4

我将一堆键值对作为参数传递给 XSL(日期 ->“1 月 20 日”,作者 ->“Dominic Rodger”,...)。

这些在我正在解析的一些 XML 中被引用 - XML 看起来像这样:

<element datasource="date" />

目前,我不知道如何从这些中获得 1 月 20 日,除非有一个可怕的<xsl:choose>声明:

<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 中枚举所有可能的映射键。有任何想法吗?

谢谢,

多姆

4

3 回答 3

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('&#xA;', @datasource, ' = ',
               $vParams/*[name() = current()/@datasource]
               )"
       />
    </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时

<data>
  <element datasource="date" />
  <element datasource="place" />
</data>

产生正确的结果

日期 = 01-15-2009

地方=夏威夷

请注意使用该xxx:node-set()函数(此处使用EXSLT函数)将 RTF(结果树片段)转换为常规 xml 文档(临时树)。

于 2009-01-15T15:03:30.807 回答
0

如果您的@datasource 始终与参数名称匹配,您可以尝试“评估”功能。注意:此代码未经测试。

<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>
于 2009-01-19T14:22:36.587 回答
-2

怎么样

<xsl:template match="date-element">
  <xsl:text>${date}</xsl:text>
</xsl:template>

即不使用属性,而是使用不同的元素名称进行匹配。

如果您无法更改源 XML,请通过将属性转换为正确元素名称的小型 XSLT 运行它。

一种不同的解决方案是将 xsl:param 元素放入不同的 XML 文档中(或尝试使 XSLT 模板再次读取自身)。然后您可以使用 xsl:key 和 key() 来引用它们。

[编辑] 将 xsl:value-of 替换为 xsl:text。我手边没有 XSLT 实用程序,所以我无法对此进行测试。如果这也不起作用,请发表评论。

于 2009-01-15T11:36:14.343 回答