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

1

Я пытаюсь использовать кое-какую логику, которая используется здесь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>
Мне пришлось изменить ваш XML, так как у вас был открывающий тегCreatePaymentInsertRecord но закрывающий тегCreateSopPaymentInsertRecord, Возможно, вы захотите перепроверить, как это сейчас и ожидается. Tim C
@TimC: спасибо за редактирование JohnXsl

Ваш Ответ

1   ответ
2

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>
Спасибо за объяснение, теперь это имеет больше смысла ... :-) JohnXsl
@JohnXsl: Добро пожаловать.
@JohnXsl:self:: ось используется для дальнейшего сужения текущего выбора. Скажем, вы хотите выбрать всеX а такжеY элементы в документе. Одним из способов является использование выражения://X | //Y но это вызывает два полных обхода документа. Лучший способ это://*[self::X or self::Y] Это будет проходить документ только один раз, проверяя на каждом элементе, является ли этоX илиY.
Спасибо за решение. Можете ли вы объяснить или дать мне несколько советов по поводу вышеупомянутого решения, в частности, как и когда использовать «само»? JohnXsl

Похожие вопросы