【问题标题】:how to call my template and my function sequentially in xslt 2.0?如何在 xslt 2.0 中按顺序调用我的模板和函数?
【发布时间】:2012-12-17 15:47:21
【问题描述】:

我正在使用 xslt2.0 将一种 xml 格式转换为另一种 xml 格式。这是我的示例 xml 文档。

<w:document>
    <w:body>
             <w:p>Para1</w:p> 
             <w:p>Para2</w:p> 
             <w:p>Para3</w:p> 
             <w:p>Para4</w:p> 
    </w:body>
</w:document>

最初这是我的 xml 格式。所以,我通过下面给出的 xslt 中的函数处理了每个 &lt;w:p&gt; 元素...

 <xsl:template match="document">
      <Document>
    <xsl:sequence select="mf:group(body/p, 1,count(//w:body//w:p)-1)"/>
      </Document>    
</xsl:template>

所以,在那个 xslt 函数中,我已经编写了如何重新格式化这些元素的代码。它工作正常......

但是现在,Xml 格式被重组如下...

<w:document>
        <w:body>
                 <w:tbl><!--some text with children elements--></w:tbl>
                 <w:tbl><!--some text with children elements--></w:tbl>
                 <w:p>Para1</w:p> 
                 <w:p>Para2</w:p> 
                 <w:p>Para3</w:p> 
                 <w:p>Para4</w:p> 
        </w:body>
 </w:document>

所以,到目前为止,我必须以相同的顺序处理 和 元素.....

我想做的是,

如果我遇到元素,那么我必须调用下面给出的模板...

<xsl:template match="document">
     <Document>
        <xsl:for-each select="w:tbl">
          <xsl:apply-templates select="w:tbl">
              </xsl:apply-templates>
      </xsl:for-each>
        <xsl:sequence select="mf:group(body/p, 1,count(//w:body//w:p)-1)"/>
     </Document>    
</xsl:template>

<xsl:template match="w:tbl">
<!--xslt code here -->
</xsl:template>

但是当我尝试转换时,for-each 语句没有被执行...

所以,请指导我摆脱这个问题...

【问题讨论】:

    标签: xslt xpath xslt-2.0 xpath-2.0


    【解决方案1】:

    我认为不是

    <xsl:template match="document">
         <Document>
            <xsl:for-each select="w:tbl">
              <xsl:apply-templates select="w:tbl">
                  </xsl:apply-templates>
          </xsl:for-each>
            <xsl:sequence select="mf:group(body/p, 1,count(//w:body//w:p)-1)"/>
         </Document>    
    </xsl:template>
    

    你只是想要

    <xsl:template match="document">
         <Document>
            <xsl:apply-templates select="w:body/w:tbl"/>
            <xsl:sequence select="mf:group(body/p, 1,count(//w:body//w:p)-1)"/>
         </Document>    
    </xsl:template>
    

    如果那不符合您的要求,请显示您想要的结果。

    【讨论】:

    • @Martin Honnen: 非常感谢 Martin 我现在不在办公室...我会检查一下然后告诉你...
    • 你认为这两个 元素都会在你的代码中执行吗?
    • 我没有正确设置应用模板,但是一旦我将在编辑中这样做,那么是的,任何tbl 都将被处理。
    • 我已经编辑了代码,如果document元素是模板中的匹配节点并且tbl是文档中body的子节点,那么路径当然需要是w:body/w:tbl.
    • 对于 XPath,序列中的第一个索引是 1 而不是 0,因此要选择 w:body 的第一个 w:tbl 子元素,您只需使用 &lt;xsl:apply-templates select="w:body/w:tbl[1]"/&gt;。如果要检查w:body 元素的第一个子元素是否为w:tbl,则使用&lt;xsl:choose&gt;&lt;xsl:when test="w:body/*[1][self::w:tbl]"&gt;...。但是,您最好开始一个新问题,在帖子中明确说明要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多