这是我的xml文档。我想使用xslt2.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:tbl/>
<w:tbl/>
</w:body>
</w:document>
这是我的xslt 2.0代码snippt。
<xsl:for-each select="following::node()[1]">
<xsl:choose>
<xsl:when test="self::w:tbl and (parent::w:body)">
<xsl:apply-templates select="self::w:tbl"/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<xsl:template match="w:tbl">
<table>
table data
</table>
</xsl:template>
我生成的输出是:
<table>
table data
<table>
table data
</table>
</table>
但我需要的输出是:
<table>
table data
</table>
<table>
table data
</table>
答案 0 :(得分:2)
如果您想要转换 w:body 元素的子元素 w:tbl 元素,您可以让模板匹配然后看起来的正文元素对于tbl元素
<xsl:template match="w:body">
<xsl:apply-templates select="w:tbl"/>
</xsl:template>
匹配 w:tbl 的模板将与以前一样。这是完整的XSLT:
<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="/*">
<xsl:apply-templates select="w:body"/>
</xsl:template>
<xsl:template match="w:body">
<xsl:apply-templates select="w:tbl"/>
</xsl:template>
<xsl:template match="w:tbl">
<table> table data </table>
</xsl:template>
</xsl:stylesheet>
当应用于您的示例XML时,输出以下内容
<table> table data </table>
<table> table data </table>
答案 1 :(得分:2)
您没有说明xsl:for-each执行时的上下文项目是什么。您没有向我们提供此信息这一事实可能表明您尚未理解上下文在XSLT中的重要性。如果不知道上下文是什么,就无法纠正您的代码。
如果你的代码是正确的,那么整个for-each可以简化为
<xsl:apply-templates select="following::node()[1][self::w:tbl][parent::w:body]"/>