XSLT - 在for-each循环中查找变量元素

时间:2016-07-10 01:29:39

标签: xml xslt xslt-2.0

我有一个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;等等。

我无法理解如何做到这一点。谁能指出我正确的方向?我一直在搞乱变量,但我无法找到任何有效的东西。

2 个答案:

答案 0 :(得分:0)

  

我正在寻找一种转变方式&#34; // canine&#34;变成一个变量   在Dog文档中,它在Cat文档中查找<canine>   寻找<feline>等等。

尝试类似:

<xsl:for-each select="collection('index.xml')//*[name()=current()/tagName]">

注意

  1. 最好使用按名称选择元素 - 但是当你的目标是一个集合时,显然你不能这样做 (?);
  2. 我不确定您的收藏是否正确定义。但这将成为另一个问题的主题。

答案 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>