我有以下XSL将转换XML文件并基本上将其展平(删除所有子节点)。但是,我不认为它是非常有效的,例如,如果没有数据的元素我的XSL仍然会打印出封闭的标签,但是真的很好,如果它没有输出任何标签,如果没有数据XML文件。只是想知道是否有人可以看看并指出我正确的方向吗?
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>
<xsl:template match="/*">
<broadWorksCDR>
<xsl:for-each select="cdrData">
<cdrData>
<serviceProvider><xsl:value-of select="headerModule/serviceProvider" /></serviceProvider>
<type><xsl:value-of select="headerModule/type" /></type>
<eventCounter><xsl:value-of select="headerModule/recordId/eventCounter" /></eventCounter>
<systemId><xsl:value-of select="headerModule/recordId/systemId" /></systemId>
<date><xsl:value-of select="headerModule/recordId/date" /></date>
<systemTimeZone><xsl:value-of select="headerModule/recordId/systemTimeZone" /></systemTimeZone>
<userNumber><xsl:value-of select="basicModule/userNumber" /></userNumber>
<groupNumber><xsl:value-of select="basicModule/groupNumber" /></groupNumber>
<direction><xsl:value-of select="basicModule/direction" /></direction>
<callingNumber><xsl:value-of select="basicModule/callingNumber" /></callingNumber>
<callingNumberContext><xsl:value-of select="basicModule/callingNumberContext" /></callingNumberContext>
</cdrData>
</xsl:for-each>
</broadWorksCDR>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
您可以使用模板,例如:
<xsl:template match="*">
<xsl:if test=". != ''">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
答案 1 :(得分:0)
你的意思是:
<xsl:if test="basicModule/groupNumber <> ''">
<groupNumber><xsl:value-of select="basicModule/groupNumber" /></groupNumber>
</xsl:if>
答案 2 :(得分:0)
您尚未提供源XML文档的代表性示例,在这种情况下,以下转换会生成所需结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes" omit-xml-declaration="no"/>
<xsl:template match="/*">
<broadWorksCDR>
<xsl:apply-templates select="cdrData"/>
</broadWorksCDR>
</xsl:template>
<xsl:template match="cdrData">
<cdrData>
<xsl:apply-templates select=
"*[self::headerModule or self::basicModule]"/>
</cdrData>
</xsl:template>
<xsl:template match=
"*[self::serviceProvider or self::type or self::eventCounter
or self::systemId or self::date or self::systemTimeZone
or self::userNumber or self::groupNumber or self::direction
or self::callingNumber or self::callingNumberContext]
[string-length() > 0]
">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
解释:
在模板中创建与所需节点匹配的元素 - 这意味着所需节点存在。匹配节点的有用属性测试完全在匹配模式中指定,包括测试所需元素以及字符串值的长度为正。