如何使用xslt 2.0获取<w:p>没有<v:group>祖先的元素?</v:group> </w:p>

时间:2011-11-24 15:29:26

标签: xml xslt xpath xslt-2.0

这是我的xml文档

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
                       xmlns:v="urn:schemas-microsoft-com:vml">

<w:body>
<w:p> <!-- Assume Current Node -->
 </w:p>
 <w:p>
  <w:r>
     <w:t>Sample data</w:t>
  </w:r>

  <w:r>
    <w:pict>
       <v:group>
         <v:shape>
            <v:textbox>
              <w:txbxContent>
                 <w:p>
                    <w:r>
                        <w:t>Sample data1</w:t>
                    </w:r>
                  </w:p>
              </w:txbxContent>
            </v:textbox>
         </v:shape>
         <v:shape>
            <v:textbox>
              <w:txbxContent>
                 <w:p>
                    <w:r>
                        <w:t>Sample data2</w:t>
                    </w:r>
                  </w:p>
              </w:txbxContent>
            </v:textbox>
         </v:shape>
       </v:group>
    </w:pict>
  </w:r>
</w:p>
</w:body>
</w:document>

我需要的xml转换结果应如下所示:

<Document>
   <paragraph>sample data</paragraph>
   <group>
        <paragraph>sample data1</paragraph>
        <paragraph>sample data1</paragraph>
    </group>
</Document>

我当前的XSLT代码段是

<Document>
<xsl:template match="//w:body/w:p">
<xsl:for-each select="following-sibling::*">
          <xsl:choose>
            <xsl:when test="self::w:p//v:group">

              <xsl:choose>
                <xsl:when test="self::w:p[not(ancestor::v:group)]">
              <xsl:apply-templates select="self::w:p"><!--this template take care about getting data inside w:p-->
              </xsl:apply-templates>
                </xsl:when>
              </xsl:choose>
              <group>
              <xsl:apply-templates select="descendant::w:p"> <!--this template take care about getting data inside w:p-->
                </xsl:apply-templates>
             </group>
            </xsl:when>
          </xsl:choose>
</xsl:for-each>

    

但它产生了这样的输出:

<Document>
 <paragraph>sample data</paragraph>
 <paragraph>sample data1</paragraph>
 <paragraph>sample data2</paragraph>
 <group>
   <paragraph>sample data1</paragraph>
   <paragraph>sample data2</paragraph>
 </group>
</Document>

你能帮助我达到我上面提到的正确结果吗?

1 个答案:

答案 0 :(得分:1)

尝试以下模板:

<xsl:template match="/">
    <Document>
        <xsl:apply-templates select="node()"/>
    </Document>
</xsl:template>

<xsl:template match="//w:body/w:p/w:r">
        <xsl:apply-templates select="node()" />    
</xsl:template>

<xsl:template match="v:group">
    <group>
        <xsl:apply-templates select="..//w:t" />    
    </group>
</xsl:template>

<xsl:template match="w:t">
    <paragraph>
        <xsl:value-of select="."/>
    </paragraph>
</xsl:template>

它给出了:

<Document>
  <paragraph>Sample data</paragraph>
  <group>
    <paragraph>Sample data1</paragraph>
    <paragraph>Sample data2</paragraph>
  </group>
</Document>

更新:添加了新模板<xsl:template match="//w:body/w:p/w:r">,使其独立于顶级元素顺序