XSLT根据父子元素的值删除子元素

时间:2012-05-17 12:25:53

标签: xslt element

我正在尝试使用此处https://stackoverflow.com/a/10629806/662877

中使用的相同逻辑

到另一个XML但没有得到预期的输出。

如果// TERR =“KHM6”,则从输入中删除/删除这两个元素 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>

示例输入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>

预期输出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>

1 个答案:

答案 0 :(得分:2)

问题在于

*[../TERR='KHM6']/CreatePaymentItems

这与具有值CreatePaymentItems的兄弟TERR的元素的"KHM6"子项匹配。

但所提供的XML文档中TERR的所有兄弟姐妹都是无子女的。

以下是您想要的转化

<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>

应用于提供的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>

产生了想要的正确结果:

<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>