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 < 1)] and Item/ItemDeliveryInformation[./PackingSlipId = 'ohne Lieferschein']">
<xsl:choose>
<xsl:when test="Item[count(./ItemDeliveryInformation < 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>
这假设您有一个通用的复制模板。
我需要检查一个“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 < 1)] and Item/ItemDeliveryInformation[./PackingSlipId = 'ohne Lieferschein']">
<xsl:choose>
<xsl:when test="Item[count(./ItemDeliveryInformation < 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>
这假设您有一个通用的复制模板。