xsl:apply-templates中的select属性

时间:2014-07-13 18:49:10

标签: xml xslt xslt-2.0

我试图在多年后回到XSL / XSLT并需要一些帮助来理解我收到的一些XSL作为示例。我想要转换的基于TEI的XML文件具有以下原理结构:

<text>
 <body>
  <div>
   <div type="text">
    <ab>
     <lg type="text-de">
      <l>TEXT</l>
      ...
     </lg>
    </ab>
   </div>
   <div type="text">
    <ab>
     <lg type="text-en">
      <l>TEXT</l>
      ...
     </lg>
    </ab>
   </div>
  </div>
 </body>
</text>

我有一个XSL片段,我想用它来转换上面的文件。我看到的XSL看起来像这样:

<xsl:template match="tei:div">
  SOME HTML CODE
  <div class="text-de">
   <xsl:apply-templates select="tei:lg[(@type='text-de')]"/>
  </div>
  <div class="text-en">
   <xsl:apply-templates select="tei:lg[(@type='text-en')]"/>
  </div>
</xsl:template>

我认为预期的HTML输出很明确,但如果您需要我解释一下,请告诉我。我想要实现的是,两个不同的文本块被插入到生成的HTML的不同位置的两个不同元素中。但是,当我运行上面的XSLT时,没有选择任何文本块。如果有任何解释让我理解本例中select属性的性质,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

lg元素未处理,因为它们不是div元素的子节点,而是它们位于ab元素内部。因此,您需要分别使用正确的名称空间前缀ab/lg选择<xsl:apply-templates select="tei:ab/tei:lg[@type='text-de']"/>

这是一个更完整的示例,输入XML为

<text xmlns="http://www.tei-c.org/ns/1.0">
 <body>
  <div>
   <div type="text">
    <ab>
     <lg type="text-de">
      <l>TEXT</l>
      ...
     </lg>
    </ab>
   </div>
   <div type="text">
    <ab>
     <lg type="text-en">
      <l>TEXT</l>
      ...
     </lg>
    </ab>
   </div>
  </div>
 </body>
</text>

和XSLT

<xsl:stylesheet 
  version="2.0"
  xmlns:tei="http://www.tei-c.org/ns/1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  exclude-result-prefixes="tei">


<xsl:template match="tei:div[@type = 'text']">
  SOME HTML CODE
  <div class="text-de">
   <xsl:apply-templates select="tei:ab/tei:lg[@type='text-de']"/>
  </div>
  <div class="text-en">
   <xsl:apply-templates select="tei:ab/tei:lg[@type='text-en']"/>
  </div>
</xsl:template>

</xsl:stylesheet>

输出

  SOME HTML CODE
  <div class="text-de">
      TEXT
      ...
     </div><div class="text-en"/>

  SOME HTML CODE
  <div class="text-de"/><div class="text-en">
      TEXT
      ...
     </div>

因此,使用正确的匹配模式和路径处理元素。我确信结果不是您想要的最终结果,但您需要添加更多模板以获得对HTML的干净转换。如果您仍有问题,请发布新问题或编辑现有问题,显示您想要的结果样本。