通过输入 xml 调用 xsl:param



我正在使用XSLT将XML转换为HTML。我的目标是通过 XML 输入提供关键信息来自动创建重复的 HTML。

因此,我正在创建这种XML文档来存储输出到最终HTML的字符串:

<animals>
    <animal id="dog">
        Our best friend 
    </animal>
    <animal id="cat">
        King of the internet
    </animal>
    <animal id="sheep">
        Baaaaaah
    </animal>
</animals>

我通过 xls:params 处理这些字符串,如下所示:

<xsl:param name="dog" select="/animals/animal[@id='dog']"/>
<xsl:param name="cat" select="/animals/animal[@id='cat']"/>
<xsl:param name="sheep" select="/animals/animal[@id='sheep']"/> 

这样我就可以使用这些字符串将这种代码片段添加到我的样式表中:

<ul>
    <li><xsl:value-of select="$dog"/></li>
    <li><xsl:value-of select="$cat"/></li>
    <li><xsl:value-of select="$sheep"/></li>
</ul>

我希望用户能够通过输入 xml 通过添加正确的标签来调用字符串。因此,如果输入 xml 是这样的:

<input_xml>
    <animals>
        <cat/>
        <dog/>
    </animals>
</input_xml>

输出将是

<ul>
    <li>King of the internet</li>
    <li>Our best friend</li>
</ul>

我正在尝试通过循环访问以下标签来自动创建此类列表:

<ul>
    <xsl:for-each select="/input_xml/animals">
        <li><xsl:value-of select="${tag name}"/></li>
    </xsl:for-each>
</ul>

但我不知道如何在select="${tag name}"中抓住输入的 xml 标签名称.我尝试使用<xsl:value-of select="name()"/>,但你不能嵌套xsl:value-of

您无法使用

<ul>
    <li><xsl:value-of select="$dog"/></li>
    <li><xsl:value-of select="$cat"/></li>
    <li><xsl:value-of select="$sheep"/></li>
</ul>

因为如果某些变量不存在,这将始终创建一个空的<li>标签。

更好的解决方案是使用您的第一个 XML 文件,将其称为 animals.xml ...

<animals>
    <animal id="dog">
        Our best friend 
    </animal>
    <animal id="cat">
        King of the internet
    </animal>
    <animal id="sheep">
        Baaaaaah
    </animal>
</animals>

。和你的第二个XML文件,称之为input.xml...

<input_xml>
    <animals>
        <cat/>
        <dog/>
    </animals>
</input_xml>

将它们与以下 XSLT 组合在一起,该 XSLT 创建一个引用第一个 XML 文档的变量:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" indent="yes" />
  <xsl:variable name="doc2" select="document('animals.xml')" />
  <xsl:template match="/input_xml"> 
    <ul>
      <xsl:for-each select="animals/*[name() = $doc2/animals/animal/@id]">
        <xsl:variable name="animalName" select="name()" />
        <li><xsl:value-of select="$doc2/animals/animal[@id=$animalName]"/></li>
      </xsl:for-each>
    </ul>
  </xsl:template>
</xsl:stylesheet>

这种组合/转换的结果是

<ul>
    <li>
        King of the internet
    </li>
    <li>
        Our best friend 
    </li>    
</ul>

此解决方案将两个输入文件合并为一个输出文件。可以在 XSLT 处理器的参数中选择input.xml

使用 XSLT 2.0 时,可以定义一个键

<xsl:key name="id" match="animals/animal" use="@id"/>

,然后使用

<ul>
    <xsl:for-each select="/input_xml/animals/*">
        <li><xsl:value-of select="key('id', name(), $animals)"/></li>
    </xsl:for-each>
</ul>

最新更新