XSLT根据父子元素的值删除子元素 [英] XSLT remove child element based on parent-child element's value

查看:100
本文介绍了XSLT根据父子元素的值删除子元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

转换为其他XML,但未获得预期的输出。

to a different XML but not getting the intended output.

如果// TERR = KHM6,然后从输入中删除/剥离这两个元素 CreatePaymentItems CreatePayExt 并生成输出。
有人可以告诉我我在这里缺少什么。

If //TERR="KHM6" then remove/strip these 2 elements CreatePaymentItems and CreatePayExt from the input and generate an output. Can someone tell me what I am missing here.

谢谢

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>


推荐答案

问题在这里

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

这与具有同级 TERR的元素的 CreatePaymentItems 子元素匹配/ code>的值为 KHM6

This matches the CreatePaymentItems child of an element that has a sibling TERR with value "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文档时(已更正,格式正确) ):

when applied on the provided XML document (corrected to be well-formed):

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

这篇关于XSLT根据父子元素的值删除子元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆