Удаление некоторых узлов из документа XML при итерации с использованием XSLT - PullRequest
3 голосов
/ 08 июня 2011

У меня небольшая проблема с некоторым XSLT.

Мой оригинальный XML выглядит так:

<?xml version="1.0"?><rowset>
  <row>
    <trans_type>10</trans_type>
    <creation_date>2011-06-07</creation_date>
    <system_id>1039</system_id>
    <transaction_set>
      <transaction>
        <trans_type>10</trans_type>
        <client_id>977400</client_id>
        <case_id>12881459</case_id>
        <invoice_no>01/2011</invoice_no>
        <payment_date>110606</payment_date>
        <payment>710,08</payment>
        <currency>EUR</currency>
        <comment>
          <record_type>612</record_type>
          <comment_text>Asiakas maksoi lisäksi kesäkuun vuokran ajalle 1.6. - 15.6.2</comment_text>
        </comment>
        <comment>
          <record_type>612</record_type>
          <comment_text>011. Meillä saldo 0 €.</comment_text>
        </comment>
      </transaction>
    </transaction_set>
    <subtotal>
      <trans_type>10</trans_type>
      <count>25</count>
    </subtotal>
  </row>
</rowset>

Мой XSLT выглядит так:

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <rowset>
      <xsl:for-each select="rowset/row/transaction_set/transaction">
        <row>
          <xsl:copy-of select="../../trans_type"/>
          <xsl:copy-of select="../../creation_date"/>
          <xsl:copy-of select="../../subtotal"/>
          <xsl:copy-of select="."/>
          <xsl:copy-of select="./client_id"/>
          <comment_text><xsl:for-each select="./comment"><xsl:value-of select="./comment_text"/></xsl:for-each></comment_text>
        </row>
      </xsl:for-each>
    </rowset>
</xsl:template>
</xsl:stylesheet> 

... и мой вывод выглядит так:

<?xml version='1.0' ?>
<rowset>
  <row>
    <trans_type>10</trans_type>
    <creation_date>2011-06-07</creation_date>
    <subtotal>
      <trans_type>10</trans_type>
      <count>25</count>
    </subtotal>
    <transaction>
      <trans_type>10</trans_type>
      <client_id>977400</client_id>           <!--need this gone-->
      <case_id>12881459</case_id>
      <invoice_no>01/2011</invoice_no>
      <payment_date>110606</payment_date>
      <payment>710,08</payment>
      <currency>EUR</currency>                <!--need this gone-->
      <comment>                               <!--need this gone-->
        <record_type>612</record_type>
        <comment_text>Asiakas maksoi lisäksi kesäkuun vuokran ajalle 1.6. - 15.6.2</comment_text>
      </comment>
      <comment>                               <!--need this gone-->
        <record_type>612</record_type>
        <comment_text>011. Meillä saldo 0 €.</comment_text>
      </comment>
    </transaction>
    <client_id>977400</client_id>
    <comment_text>Asiakas maksoi lisäksi kesäkuun vuokran ajalle 1.6. - 15.6.2011. Meillä saldo 0 €.</comment_text>
  </row>
</rowset>

Мне нужно удалить следующие теги из моего вывода \rowset\row\transaction\comment, \rowset\row\transaction\client_id и \rowset\row\transcation\currency.Хотя мне удалось изменить XML так, как я хочу, я не могу удалить узлы, которые мне не нужны.

В исходном XML может быть более одного transaction в transaction_set, и каждый transaction может содержать несколько comment.Я пытаюсь объединить все comment\comment_text записи, которые мне удалось сделать, но мне нужно, чтобы эти comment теги были удалены из \rowset\row\transaction в выходном XML.

Может быть, я занимаюсь этим внеправильный путь, но я не могу обойти это.

1 Ответ

2 голосов
/ 08 июня 2011

Более простой способ достичь этого - взять преобразование идентификаторов (то есть тот, который просто копирует каждый элемент / атрибут), а затем добавить недопустимые совпадения для элементов, которые вы хотите опустить:

<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="*"/>

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

 <!-- add elements that you want to omit here -->
 <xsl:template match="//client_id"/>
 <xsl:template match="//comment"/>
 ...

</xsl:stylesheet>

Смотрите этот связанный вопрос:

XSL Transform удалить Xml Elements

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