Удаление некоторых узлов из документа XML при итерации с использованием XSLT

У меня небольшая проблема с некоторыми 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 ******** 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">
 
 </xsl:copy-of></xsl:copy-of></xsl:copy-of></xsl:copy-of></xsl:copy-of></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 ******** 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 ******** 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 ответ

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

<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:apply-templates></xsl:copy>
 </xsl:template>
 <!-- add elements that you want to omit here -->
 <xsl:template match="//client_id">
 <xsl:template match="//comment">
 ...
</xsl:template></xsl:template></xsl:strip-space></xsl:output></xsl:stylesheet>

Смотрите этот вопрос:

XSL Transform удаляет Xml-элементы

licensed under cc by-sa 3.0 with attribution.