Как удалить полный узел с XSLT на основе значения одного из его детей - PullRequest
2 голосов
/ 09 декабря 2011

Я пытаюсь отфильтровать нежелательные данные из файла XML. У меня есть следующий XML:

<Client>
    <Address>
    </Address>
    <Documents>
        <Invoice>
            <Document></Document>
            <No>9999<No>
            <Content>H4s==</Content>
        </Invoice>
        <Invoice>
            <Document>
                <File>
                    <Code>THIS IS THE ONE<Code>
                    <Name>
                        <value locale="en">Invoice for January</value>
                    </Name>
                </File>
            </Document>
            <No>7777</No>
            <Content>H4sIAA1XyDQA=</Content>
        </Invoice>
    </Documents>
</Client>

И я не хочу, чтобы в результате были все <Invoice>, где тег <Document> пуст.

Таким образом, в некотором смысле результат будет выглядеть так:

<Client>
    <Address>
    </Address>
    <Documents>
        <Invoice>
            <Document>
                <File>
                    <Code>THIS IS THE ONE<Code>
                    <Name>
                        <value locale="en">Invoice for January</value>
                    </Name>
                </File>
            </Document>
            <No>7777</No>
            <Content>H4sIAA1XyDQA=</Content>
        </Invoice>
    </Documents>
</Client>

Спасибо

1 Ответ

2 голосов
/ 09 декабря 2011

Это можно сделать, переопределив шаблон идентификации.

Это XSLT:

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

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

  <xsl:template match="Invoice[not(Document/node())]"/>

</xsl:stylesheet>

Применяется к вашему XML-вводу (исправлено, чтобы быть корректным):

<Client>
  <Address>
  </Address>
  <Documents>
    <Invoice>
      <Document></Document>
      <No>9999</No>
        <Content>H4s==</Content>
    </Invoice>
    <Invoice>
      <Document>
        <File>
          <Code>THIS IS THE ONE</Code>
            <Name>
              <value locale="en">Invoice for January</value>
            </Name>
        </File>
      </Document>
      <No>7777</No>
      <Content>H4sIAA1XyDQA=</Content>
    </Invoice>
  </Documents>
</Client>

Создает следующий вывод:

<Client>
   <Address/>
   <Documents>
      <Invoice>
         <Document>
            <File>
               <Code>THIS IS THE ONE</Code>
               <Name>
                  <value locale="en">Invoice for January</value>
               </Name>
            </File>
         </Document>
         <No>7777</No>
         <Content>H4sIAA1XyDQA=</Content>
      </Invoice>
   </Documents>
</Client>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...