我正在使用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>