更高效的XSL

时间:2011-08-15 09:20:20

标签: xml xslt

我有以下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>

3 个答案:

答案 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>

解释

在模板中创建与所需节点匹配的元素 - 这意味着所需节点存在。匹配节点的有用属性测试完全在匹配模式中指定,包括测试所需元素以及字符串值的长度为正。