XSLT 1.0 计数和删除

XSLT 1.0 count and remove

我需要检查一个“Item”是否有多个名为“ItemDeliveryInformation”的节点,如果有,节点“PackingSlipId”的值是否为“ohne Lieferschein”。 例如一个带有“PackingSLipId = ohne Lieferschein”的节点“ItemDeliveryInformation”是可以的,但是如果“Item”处有两个或更多节点“ItemDeliveryInformation”也可以,但是如果这几个节点之一的值为“ohne Lieferschein”在“PackingSlipId”处,XSLT 必须删除整个节点“ItemDeliveryInformation”,其中“PackingSlipId = ohne Lieferschein”。

我是这样开始的:

<xsl:template match="Item[count(./ItemDeliveryInformation &lt; 1)] and Item/ItemDeliveryInformation[./PackingSlipId = 'ohne Lieferschein']">   
        <xsl:choose>
            <xsl:when test="Item[count(./ItemDeliveryInformation &lt; 1)] and Item/ItemDeliveryInformation[./PackingSlipId = 'ohne Lieferschein']"></xsl:when>
                <xsl:otherwise> <xsl:apply-templates select="@* | node()"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

错误示例:

<?xml version="1.0" encoding="utf-8"?>
<SALESINVOICE>
    <Interchange>
        <Test>No</Test>
    </Interchange>
    <HeaderInformation>
        <OrigInvoiceNumber>1</OrigInvoiceNumber>
    </HeaderInformation>
    <LineInformation>
        <Item>
            <LineNum>1000</LineNum>
            <GTIN>1234</GTIN>
            <ItemDeliveryInformation>
                <LineNumDeliveryNote>1000</LineNumDeliveryNote>
                <PackingSlipId_Created>2022-01-19T06:26:24</PackingSlipId_Created>
                <PackingSlipId>LS-0062820</PackingSlipId>
                <DeliveryDate>2022-01-19</DeliveryDate>
                <DeliveredQuantity>3.00</DeliveredQuantity>
                <ShipFromAddressInformation/>
            </ItemDeliveryInformation>
            <ItemDeliveryInformation>
                <LineNumDeliveryNote>1000</LineNumDeliveryNote>             
                <PackingSlipId>ohne Lieferschein</PackingSlipId>
                <DeliveryDate>2022-01-25</DeliveryDate>
                <DeliveredQuantity>3.00</DeliveredQuantity>
                <ShipFromAddressInformation/>
            </ItemDeliveryInformation>
                <ItemDeliveryInformation>
                <LineNumDeliveryNote>1000</LineNumDeliveryNote>
                <PackingSlipId_Created>2022-01-19T06:26:24</PackingSlipId_Created>
                <PackingSlipId>LS-0062822</PackingSlipId>
                <DeliveryDate>2022-01-19</DeliveryDate>
                <DeliveredQuantity>3.00</DeliveredQuantity>
                <ShipFromAddressInformation/>
            </ItemDeliveryInformation>
        </Item>
        <Item>
            <LineNum>1002</LineNum>
            <GTIN>4657</GTIN>
            <ItemDeliveryInformation>
                <LineNumDeliveryNote>1002</LineNumDeliveryNote>
                <PackingSlipId_Created>2022-01-25</PackingSlipId_Created>
                <PackingSlipId>ohne Lieferschein</PackingSlipId>
                <DeliveryDate>2022-01-25</DeliveryDate>
                <DeliveredQuantity>1.00</DeliveredQuantity>
                <ShipFromAddressInformation/>
            </ItemDeliveryInformation>
        </Item>
    </LineInformation>
</SALESINVOICE>

正确示例:

<?xml version="1.0" encoding="UTF-8"?>
<SALESINVOICE>
   <Interchange>
      <Test>No</Test>
   </Interchange>
   <HeaderInformation>
      <OrigInvoiceNumber>1</OrigInvoiceNumber>
   </HeaderInformation>
   <LineInformation>
      <Item>
         <LineNum>1000</LineNum>
         <GTIN>1234</GTIN>
         <ItemDeliveryInformation>
            <LineNumDeliveryNote>1000</LineNumDeliveryNote>
            <PackingSlipId_Created>2022-01-19T06:26:24</PackingSlipId_Created>
            <PackingSlipId>LS-0062820</PackingSlipId>
            <DeliveryDate>2022-01-19</DeliveryDate>
            <DeliveredQuantity>3.00</DeliveredQuantity>
         </ItemDeliveryInformation>
         <ItemDeliveryInformation>
            <LineNumDeliveryNote>1000</LineNumDeliveryNote>
            <PackingSlipId_Created>2022-01-19T06:26:24</PackingSlipId_Created>
            <PackingSlipId>LS-0062822</PackingSlipId>
            <DeliveryDate>2022-01-19</DeliveryDate>
            <DeliveredQuantity>3.00</DeliveredQuantity>
         </ItemDeliveryInformation>
      </Item>
      <Item>
         <LineNum>1002</LineNum>
         <GTIN>4657</GTIN>
         <ItemDeliveryInformation>
            <LineNumDeliveryNote>1002</LineNumDeliveryNote>
            <PackingSlipId_Created>2022-01-25</PackingSlipId_Created>
            <PackingSlipId>ohne Lieferschein</PackingSlipId>
            <DeliveryDate>2022-01-25</DeliveryDate>
            <DeliveredQuantity>1.00</DeliveredQuantity>
         </ItemDeliveryInformation>
      </Item>
   </LineInformation>
</SALESINVOICE>

感谢您的帮助

Item[…] and Item/ItemDeliveryInformation[…] 永远不会匹配,因为没有节点既是 Item 又是 ItemDeliveryInformation。不要在匹配中复制条件,那没有意义。

您想在 ItemDeliveryInformation 上进行匹配,如果它同时具有 ohne Lieferschein 和兄弟节点,则将其删除。由于remove是没有复制,所以复制的时候把条件倒过来:

<xsl:template match="Item/ItemDeliveryInformation">
  <xsl:if test="count(preceding-sibling::ItemDeliveryInformation|following-sibling::ItemDeliveryInformation)=0 or PackingSlipId/text() != 'ohne Lieferschein'">
    <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy>
  </xsl:if>
</xsl:template>

这假设您有一个通用的复制模板。