我有一个XML文档,我正在转换为多个HTML文档。问题是,对于生成的每个文档,我需要在单独的XML文件集合中查找不同的节点。
想象一下我的XML看起来像这样:
<index>
<item>
<species>Dog</species>
<tagName>canine</tagName>
</item>
<item>
<species>Cat</species>
<tagName>feline</tagName>
</item>
<index>
我有几十个文件的集合,其中包含分别称为“犬”和“猫”的元素。我需要在每个文件中使用正确的文件。
我的XSLT看起来像这样:
<xsl:template match="/">
<xsl:for-each select="index/item">
<xsl:result-document method="xml" href="{species}.html">
<xsl:for-each select="collection('index.xml')//canine">
<xsl:value-of select=".">
</xsl:for-each>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
我正在寻找一种方法将“// canine”转换为变量,以便在Dog文档中查找&lt; canine&gt;,在Cat文档中它查找&lt; feline&gt;等等。
我无法理解如何做到这一点。谁能指出我正确的方向?我一直在搞乱变量,但我无法找到任何有效的东西。
答案 0 :(得分:0)
我正在寻找一种转变方式&#34; // canine&#34;变成一个变量 在Dog文档中,它在Cat文档中查找
<canine>
寻找<feline>
等等。
尝试类似:
<xsl:for-each select="collection('index.xml')//*[name()=current()/tagName]">
注意:
答案 1 :(得分:0)
根据我们尚未显示的代码,您可能或可能无法使用XSLT current()
函数。
此代码不使用 current()
:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="index/item">
<xsl:result-document method="xml" href="{species}.html">
<xsl:sequence select=
"for $tag in tagName[1]
return collection('index.xml')//*[name() eq $tag]/string()"/>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
如果您想使用key()
函数(可能加速转换),请尝试以下操作:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kElemByName" match="*" use="name()"/>
<xsl:template match="index/item">
<xsl:result-document method="xml" href="{species}.html">
<xsl:sequence select=
"for $t in tagName[1], $doc in collection('index.xml')
return key('kElemByName', $t, $doc)"/>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>