Проверьте наличие пустого элемента XML с помощью XSLT - PullRequest
3 голосов
/ 20 марта 2012

У меня есть следующий XML

<ns0:Root xmlns:ns0="http://Map_Sample.Input_Schema">
<Number1>
</Number1>
<Number2>11</Number2>
<Number3>12</Number3>
</ns0:Root>

В этом случае я получаю ENTER или \r\n за Number1. Я хочу написать XSLT, чтобы проверить, содержит ли узел ENTER или \r\n, а затем заменить его <Number1 />.

Может ли кто-нибудь помочь мне написать XSLT для этого?

Ответы [ 2 ]

10 голосов
/ 20 марта 2012

Существуют различные возможные определения того, что может означать «пустой элемент» .

Давайте определим пустой элемент как элемент, который не имеет никакого элементаузлы-потомки, строковое значение которых является пустой строкой или состоит только из символов пробела ('', CR, NL).

Затем, чтобы проверить, является ли данный элемент пустым, используйте :

not(*) and not(normalize-space())

Предполагается, что элемент является узлом контекста, когда вычисляется выражение XPath.

В этом случае я получаю "ENTER" или "\ r \ n«для № 1.Я хочу написать XSLT, чтобы проверить, содержит ли узел «ENTER» или «\ r \ n», а затем заменить его.

Вы не указали, чем этот текстовый узел должен быть заменен, поэтому в этомРешение Я предполагаю, что текстовый узел должен быть заменен пустой строкой (удалено):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="*[not(*) and not(normalize-space())]">
  <xsl:element name="{name()}" namespace="{namespace-uri()}"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML:

<ns0:Root xmlns:ns0="http://Map_Sample.Input_Schema">
    <Number1>
    </Number1>
    <Number2>11</Number2>
    <Number3>12</Number3>
</ns0:Root>

желаемый результат получается :

<ns0:Root xmlns:ns0="http://Map_Sample.Input_Schema">
   <Number1/>
   <Number2>11</Number2>
   <Number3>12</Number3>
</ns0:Root>
0 голосов
/ 20 марта 2012

Попробуйте следующее:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[normalize-space(string(.)) = '']"/>
</xsl:stylesheet>

Объяснение: пропустить вывод для элементов, в которых текстовое содержимое (полных потомков) является чистым пробелом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...