这是我的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>
你能帮助我达到我上面提到的正确结果吗?
答案 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">
,使其独立于顶级段和组元素顺序