这是我的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 Snippt是:
<?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>
请指导我获取元素而不会丢失它保留的顺序......
答案 0 :(得分: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>
答案 1 :(得分: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>