Более эффективный XSL - PullRequest
2 голосов
/ 15 августа 2011

У меня есть следующий 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 ]

1 голос
/ 15 августа 2011

Вы можете использовать шаблон, например ::10000

<xsl:template match="*">
    <xsl:if test=". != ''">
        <xsl:copy-of select="."/>
    </xsl:if>
</xsl:template>
0 голосов
/ 15 августа 2011

Вы не предоставили репрезентативный пример исходного 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>

Объяснение :

В шаблоне создается элемент, который соответствует требуемому узлу - это означает, что требуемый узел существует. Проверка требуемых свойств совпадающих узлов полностью указывается в шаблоне сопоставления, в том числе проверка полезных элементов и положительной длины их строкового значения.

0 голосов
/ 15 августа 2011

Вы имеете в виду что-то вроде:

<xsl:if test="basicModule/groupNumber <> ''">
   <groupNumber><xsl:value-of select="basicModule/groupNumber" /></groupNumber>
</xsl:if>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...