3

这对我来说很难用英语表达,所以举个例子可能会有所帮助。假设我有几个称为句子的元素,它由几个术语组成。在 XML 的另一部分中,有一组带有语言代码的元素。我想为每个句子应用与语言数量一样多的模板,并使用适当的语言代码调用该模板。由此:

<description>
    <sentences>
        <sentence>
            <term type="adjective">nice</term>
            <term type="tripType">cycling</term>
        </sentence>
        <sentence>
            <term type="adjective">boring</term>
            <term type="tripType">hike</term>
        </sentence>
    </sentences>
    <languages>
        <l>cs</l>
        <l>en</l>
    </languages>
</description>

我想制作这样的东西:

<div>
 <p><span>cs</span> nice cycling</p>
 <p><span>en</span> nice cycling</p>
</div>

<div>    
 <p><span>cs</span> boring hike</p>
 <p><span>en</span> boring hike</p>
</div>

我试图使用<xsl:for-each select="/description/languages/l">,但这将内容设置l为当前元素,我无法再使用术语 stuff。

任何想法将不胜感激。谢谢

4

3 回答 3

1
<xsl:template match="description">
  <xsl:apply-templates select="sentences/sentence" />
</xsl:template>

<xsl:template match="sentence">
  <xsl:variable name="terms" select="term" />
  <div>
    <xsl:for-each select="../../languages/l">
      <p>
        <span><xsl:value-of select="." /></span>
        <xsl:apply-templates select="$terms" />
      </p>
    <xsl:for-each>
  </div>
</xsl:template>

<xsl:template match="term">
  <xsl:apply-templates select="." />
  <xsl:if test="position() &lt; last()"> </xsl:if>
</xsl:template>
于 2012-05-03T08:49:44.723 回答
1

这个简单的转换(没有明确的条件)

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="sentence">
  <xsl:variable name="vSentence" select="."/>
  <div>
       <xsl:for-each select="/*/languages/l">
         <p>
           <span><xsl:value-of select="."/></span>
           <xsl:apply-templates select="$vSentence/term"/>
         </p>
       </xsl:for-each>
     </div>
 </xsl:template>

 <xsl:template match="term[position() > 1]">
  <xsl:text> </xsl:text>
  <xsl:value-of select="."/>
 </xsl:template>
 <xsl:template match="l"/>
</xsl:stylesheet>

应用于提供的 XML 文档时

<description>
    <sentences>
        <sentence>
            <term type="adjective">nice</term>
            <term type="tripType">cycling</term>
        </sentence>
        <sentence>
            <term type="adjective">boring</term>
            <term type="tripType">hike</term>
        </sentence>
    </sentences>
    <languages>
        <l>cs</l>
        <l>en</l>
    </languages>
</description>

产生想要的正确结果

<div>
   <p><span>cs</span>nice cycling</p>
   <p><span>en</span>nice cycling</p>
</div>
<div>
   <p><span>cs</span>boring hike</p>
   <p><span>en</span>boring hike</p>
</div>
于 2012-05-03T12:43:23.150 回答
0

您可以将当前元素(术语 stuff,如果我理解正确的话)分配给一个变量,然后在 for-each 循环中使用该变量:<xsl:variable name="term" select="current()"/>

于 2012-05-03T08:32:52.303 回答