XSLT удаляет дочерний элемент на основе значения родительского-дочернего элемента

Я пытаюсь использовать кое-какую логику, которая используется здесьhttps://stackoverflow.com/a/10629806/662877

в другой XML, но не получая предполагаемый вывод.

Если // TERR = & quot; KHM6 & quot; затем удалите / удалите эти 2 элементаCreatePaymentItems а такжеCreatePayExt из ввода и генерировать выход. Может кто-нибудь сказать мне, что мне здесь не хватает.

Спасибо

XSLT:

<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=
 "*[../TERR='KHM6']/CreatePaymentItems | *[../TERR='KHM6']/CreatePayExt"/>
</xsl:stylesheet>

Sample Input XML:

<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return">
  <TransactionType>
    <PayLineItems>
      <PayLineInsert>
        <PAYTYPE>4</PAYTYPE>
        <NUMBER>R2293416</NUMBER>
        <SERIAL>3335889530</SERIAL>
        <DOCDATE>05/03/2012</DOCDATE>
        <ITEMNMBR>4NZ3330000010</ITEMNMBR>
        <UNITPRCE>599.99</UNITPRCE>
        <XTNDPRCE>599.99</XTNDPRCE>
        <QUANTITY>1</QUANTITY>
        <TAXAMNT>43.65</TAXAMNT>
        <QTYONHND>1</QTYONHND>
        <TERR>KHM6</TERR>
      </PayLineInsert>
    </PayLineItems>
    <PayLineEXT>
      <PAYTYPE>4</PAYTYPE>
      <NUMBER>R2293416</NUMBER>
      <LNITMSEQ>2293416</LNITMSEQ>
    </PayLineEXT>
    <CreatePaymentItems>
      <CreatePaymentInsertRecord>
        <INTERID>TOTM</INTERID>
        <PAYTYPE>4</PAYTYPE>
        <PAYNUMBER>R2293416</PAYNUMBER>
        <DOCDATE>05/03/2012</DOCDATE>
        <DOCAMOUNT>645.03</DOCAMOUNT>
        <DOCNUMBER>2293416</DOCNUMBER>
      </CreatePaymentInsertRecord>
    </CreatePaymentItems>
    <CreatePayExt>
      <PAYTYPE>4</PAYTYPE>
      <PAYNUMBER>R2293416</PAYNUMBER>
      <SEQNUMBR>61261585</SEQNUMBR>
    </CreatePayExt>
  </TransactionType>
</ns0:DocTran>

Expected Output XML:

<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return">
  <TransactionType>
    <PayLineItems>
      <PayLineInsert>
        <PAYTYPE>4</PAYTYPE>
        <NUMBER>R2293416</NUMBER>
        <SERIAL>3335889530</SERIAL>
        <DOCDATE>05/03/2012</DOCDATE>
        <ITEMNMBR>4NZ3330000010</ITEMNMBR>
        <UNITPRCE>599.99</UNITPRCE>
        <XTNDPRCE>599.99</XTNDPRCE>
        <QUANTITY>1</QUANTITY>
        <TAXAMNT>43.65</TAXAMNT>
        <QTYONHND>1</QTYONHND>
        <TERR>KHM6</TERR>
      </PayLineInsert>
    </PayLineItems>
    <PayLineEXT>
      <PAYTYPE>4</PAYTYPE>
      <NUMBER>R2293416</NUMBER>
      <LNITMSEQ>2293416</LNITMSEQ>
    </PayLineEXT>
  </TransactionType>
</ns0:DocTran>
 JohnXsl17 мая 2012 г., 16:59
@TimC: спасибо за редактирование
 Tim C17 мая 2012 г., 14:42
Мне пришлось изменить ваш XML, так как у вас был открывающий тегCreatePaymentInsertRecord но закрывающий тегCreateSopPaymentInsertRecord, Возможно, вы захотите перепроверить, как это сейчас и ожидается.

Ответы на вопрос(1)

Решение Вопроса

The problem is here:

Это соответствуетCreatePaymentItems ребенок элемента, который имеет родного братаTERR со значением"KHM6".

Но все братья и сестрыTERR в предоставленном документе XML являются дочерними.

Here is the transformation you want:

<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=
 "*[PayLineItems/*/TERR = 'KHM6']
      /*[self::CreatePaymentItems or self::CreatePayExt]"/>
</xsl:stylesheet>

when applied on the provided XML document (исправлено, чтобы быть правильно сформированным):

<ns0:DocTran doctype="Return" xmlns:ns0="http://test.Schemas.Out_Return">
    <TransactionType>
        <PayLineItems>
            <PayLineInsert>
                <PAYTYPE>4</PAYTYPE>
                <NUMBER>R2293416</NUMBER>
                <SERIAL>3335889530</SERIAL>
                <DOCDATE>05/03/2012</DOCDATE>
                <ITEMNMBR>4NZ3330000010</ITEMNMBR>
                <UNITPRCE>599.99</UNITPRCE>
                <XTNDPRCE>599.99</XTNDPRCE>
                <QUANTITY>1</QUANTITY>
                <TAXAMNT>43.65</TAXAMNT>
                <QTYONHND>1</QTYONHND>
                <TERR>KHM6</TERR>
            </PayLineInsert>
        </PayLineItems>
        <PayLineEXT>
            <PAYTYPE>4</PAYTYPE>
            <NUMBER>R2293416</NUMBER>
            <LNITMSEQ>2293416</LNITMSEQ>
        </PayLineEXT>
        <CreatePaymentItems>
            <CreatePaymentInsertRecord>
                <INTERID>TOTM</INTERID>
                <PAYTYPE>4</PAYTYPE>
                <PAYNUMBER>R2293416</PAYNUMBER>
                <DOCDATE>05/03/2012</DOCDATE>
                <DOCAMOUNT>645.03</DOCAMOUNT>
                <DOCNUMBER>2293416</DOCNUMBER>
            </CreatePaymentInsertRecord>
        </CreatePaymentItems>
        <CreatePayExt>
            <PAYTYPE>4</PAYTYPE>
            <PAYNUMBER>R2293416</PAYNUMBER>
            <SEQNUMBR>61261585</SEQNUMBR>
        </CreatePayExt>
    </TransactionType>
</ns0:DocTran>

the wanted, correct result is produced:

<ns0:DocTran xmlns:ns0="http://test.Schemas.Out_Return" doctype="Return">
   <TransactionType>
      <PayLineItems>
         <PayLineInsert>
            <PAYTYPE>4</PAYTYPE>
            <NUMBER>R2293416</NUMBER>
            <SERIAL>3335889530</SERIAL>
            <DOCDATE>05/03/2012</DOCDATE>
            <ITEMNMBR>4NZ3330000010</ITEMNMBR>
            <UNITPRCE>599.99</UNITPRCE>
            <XTNDPRCE>599.99</XTNDPRCE>
            <QUANTITY>1</QUANTITY>
            <TAXAMNT>43.65</TAXAMNT>
            <QTYONHND>1</QTYONHND>
            <TERR>KHM6</TERR>
         </PayLineInsert>
      </PayLineItems>
      <PayLineEXT>
         <PAYTYPE>4</PAYTYPE>
         <NUMBER>R2293416</NUMBER>
         <LNITMSEQ>2293416</LNITMSEQ>
      </PayLineEXT>
   </TransactionType>
</ns0:DocTran>
 17 мая 2012 г., 20:44
@JohnXsl: Добро пожаловать.
 JohnXsl17 мая 2012 г., 20:06
Спасибо за объяснение, теперь это имеет больше смысла ... :-)
 JohnXsl17 мая 2012 г., 17:02
Спасибо за решение. Можете ли вы объяснить или дать мне несколько советов по поводу вышеупомянутого решения, в частности, как и когда использовать «само»?
 17 мая 2012 г., 17:20
@JohnXsl:self:: ось используется для дальнейшего сужения текущего выбора. Скажем, вы хотите выбрать всеX а такжеY элементы в документе. Одним из способов является использование выражения://X | //Y но это вызывает два полных обхода документа. Лучший способ это://*[self::X or self::Y] Это будет проходить документ только один раз, проверяя на каждом элементе, является ли этоX илиY.

Ваш ответ на вопрос