1

这是我的 Xml 文件。我想使用 xslt 将此 xml 文件转换为另一个自定义的 xml 文件。

XML 文件:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
    <w:body>
    <w:p>
        <w:r>
            <w:t>Text1-</w:t>
        </w:r>
        <w:smartTag>
            <w:smartTag>
                <w:smartTag>
                    <w:smartTag>
                        <w:r>
                            <w:t>Text2-</w:t>
                        </w:r>
                    </w:smartTag>
                </w:smartTag>
                <w:r>
                    <w:t>Text3-</w:t>
                </w:r>
                <w:smartTag>
                        <w:r>
                            <w:t>Text4-</w:t>
                        </w:r>
                </w:smartTag>
                <w:r>
                    <w:t>Text5-</w:t>
                </w:r>
            </w:smartTag>
        </w:smartTag>
        <w:r>
            <w:t>Text6-</w:t>
        </w:r>
    </w:p>
    </w:body>
    </w:document>

而我的 XSLT 片段是:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">                              
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="*">

    <Document>
        <xsl:choose>
            <xsl:apply-templates select="//w:p[w:r[w:t]]">
            </xsl:apply-templates>      
      </xsl:choose>
    </Document>
  </xsl:template>


  <xsl:template match="w:p">
    <Paragraph>

     <xsl:if test="(.//w:smartTag/w:r/w:t)">
            <xsl:apply-templates select="//w:smartTag//w:r//w:t"/>
     </xsl:if>
    <xsl:apply-templates select="./w:r/w:t"/>
    </Paragraph>    
  </xsl:template>


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

我当前的输出是:

<Document>
<Paragraph>
       Text2-Text3-Text4-Text5-Text1-Text6-
</Paragraph>
</Document>

我需要的输出是:

<Document>
    <Paragraph>
           Text1-Text2-Text3-Text4-Text5-Text6-
    </Paragraph>
</Document>

请指导我在不丢失其保留顺序的情况下获取元素...

4

2 回答 2

3

除非您对应该处理的内容有一些额外的规则,否则这可以非常简单地通过使用模板来匹配w:t元素

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

您还需要匹配来处理文档和段落。尝试以下 XML

<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    
 xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" 
 exclude-result-prefixes="w">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/">
      <Document>
         <xsl:apply-templates />
      </Document>
   </xsl:template>

   <xsl:template match="w:p">
      <Paragraph>
         <xsl:apply-templates />
      </Paragraph>
   </xsl:template>

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

   <!-- Ignore text for all other elements -->
   <xsl:template match="text()"/>
</xsl:stylesheet>

应用于您的示例 XML 时,将输出以下内容

<Document>
   <Paragraph>Text1-Text2-Text3-Text4-Text5-Text6-</Paragraph>
</Document>
于 2012-06-21T11:58:46.580 回答
1

简短而简单:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
 exclude-result-prefixes="w">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*/*/w:p">
     <Document>
      <Paragraph>
        <xsl:value-of select="string()"/>
      </Paragraph>
     </Document>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
    <w:body>
        <w:p>
            <w:r>
                <w:t>Text1-</w:t>
            </w:r>
            <w:smartTag>
                <w:smartTag>
                    <w:smartTag>
                        <w:smartTag>
                            <w:r>
                                <w:t>Text2-</w:t>
                            </w:r>
                        </w:smartTag>
                    </w:smartTag>
                    <w:r>
                        <w:t>Text3-</w:t>
                    </w:r>
                    <w:smartTag>
                        <w:r>
                            <w:t>Text4-</w:t>
                        </w:r>
                    </w:smartTag>
                    <w:r>
                        <w:t>Text5-</w:t>
                    </w:r>
                </w:smartTag>
            </w:smartTag>
            <w:r>
                <w:t>Text6-</w:t>
            </w:r>
        </w:p>
    </w:body>
</w:document>

产生了想要的正确结果:

<Document>
   <Paragraph>Text1-Text2-Text3-Text4-Text5-Text6-</Paragraph>
</Document>
于 2012-06-21T12:41:52.983 回答