基于节点值的 XSL 过滤元素
XSL filter elements based on node value
我似乎无法弄清楚如何才能成功实现这个基本的 xsl。我想用 SalesOrderStatus 值 <> SalesOrder 过滤掉 xml 中的所有 SalesLines 元素(不要保留 Sent / CancelledBySales)。
来源XML:
<?xml version="1.0" encoding="UTF-8"?><Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{9CEDBBC7-5AF3-4A8B-AC68-49F1E0D8402A}</MessageId>
<SourceEndpoint>hwf</SourceEndpoint>
<DestinationEndpoint>HWF_ORDRSP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesOrderService/read</Action>
</Header>
<Body>
<MessageParts>
<SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<SalesTable class="entity">
<CustAccount>00003</CustAccount>
<DeliveryDate>2019-10-21</DeliveryDate>
<POMOrderId>0002539819</POMOrderId>
<PurchOrderFormNum>4500143886</PurchOrderFormNum>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesLine class="entity">
<ExtLineNum>10</ExtLineNum>
<ItemId>08201</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>20</ExtLineNum>
<ItemId>08236</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>Sent</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>30</ExtLineNum>
<ItemId>08238</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>40</ExtLineNum>
<ItemId>08254</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>CancelledBySales</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
</SalesTable>
</SalesOrder>
</MessageParts>
</Body>
</Envelope>
预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{9CEDBBC7-5AF3-4A8B-AC68-49F1E0D8402A}</MessageId>
<SourceEndpoint>hwf</SourceEndpoint>
<DestinationEndpoint>HWF_ORDRSP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesOrderService/read</Action>
</Header>
<Body>
<MessageParts xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<SalesTable class="entity">
<CustAccount>00003</CustAccount>
<DeliveryDate>2019-10-21</DeliveryDate>
<POMOrderId>0002539819</POMOrderId>
<PurchOrderFormNum>4500143886</PurchOrderFormNum>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesLine class="entity">
<ExtLineNum>10</ExtLineNum>
<ItemId>08201</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>30</ExtLineNum>
<ItemId>08238</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
</SalesTable>
</SalesOrder>
</MessageParts>
</Body>
</Envelope>
到目前为止我创建的 XSL:
<!-- Michael van den Dool 18-10-2019 17:46 filter saleslines -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder" exclude-result-prefixes="xs" version="2.0">
<!-- Copy everything -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- Match elements which need to be filtered and do not copy them to the output -->
<xsl:template match="SalesTable/SalesLine[not(SalesTable/SalesLine/SalesOrderStatus/text() = 'SalesOrder')]"/>
</xsl:stylesheet>
当运行 xsl 没有被过滤掉。我认为它在某个名称空间/层次结构中。但我还是xsl的业余爱好者,抱歉..
这是一个简单、简短的 XSLT 1.0 解决方案。
您的主要问题是未能在匹配模式中指定元素的名称空间 -- 它们不在 "no namespace"
中
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<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="x:SalesLine[not(x:SalesOrderStatus = 'SalesOrder')]"/>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{9CEDBBC7-5AF3-4A8B-AC68-49F1E0D8402A}</MessageId>
<SourceEndpoint>hwf</SourceEndpoint>
<DestinationEndpoint>HWF_ORDRSP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesOrderService/read</Action>
</Header>
<Body>
<MessageParts>
<SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<SalesTable class="entity">
<CustAccount>00003</CustAccount>
<DeliveryDate>2019-10-21</DeliveryDate>
<POMOrderId>0002539819</POMOrderId>
<PurchOrderFormNum>4500143886</PurchOrderFormNum>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesLine class="entity">
<ExtLineNum>10</ExtLineNum>
<ItemId>08201</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>20</ExtLineNum>
<ItemId>08236</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>Sent</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>30</ExtLineNum>
<ItemId>08238</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>40</ExtLineNum>
<ItemId>08254</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>CancelledBySales</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
</SalesTable>
</SalesOrder>
</MessageParts>
</Body>
</Envelope>
产生了想要的、正确的结果:
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{9CEDBBC7-5AF3-4A8B-AC68-49F1E0D8402A}</MessageId>
<SourceEndpoint>hwf</SourceEndpoint>
<DestinationEndpoint>HWF_ORDRSP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesOrderService/read</Action>
</Header>
<Body>
<MessageParts>
<SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<SalesTable class="entity">
<CustAccount>00003</CustAccount>
<DeliveryDate>2019-10-21</DeliveryDate>
<POMOrderId>0002539819</POMOrderId>
<PurchOrderFormNum>4500143886</PurchOrderFormNum>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesLine class="entity">
<ExtLineNum>10</ExtLineNum>
<ItemId>08201</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>30</ExtLineNum>
<ItemId>08238</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
</SalesTable>
</SalesOrder>
</MessageParts>
</Body>
</Envelope>
我似乎无法弄清楚如何才能成功实现这个基本的 xsl。我想用 SalesOrderStatus 值 <> SalesOrder 过滤掉 xml 中的所有 SalesLines 元素(不要保留 Sent / CancelledBySales)。
来源XML:
<?xml version="1.0" encoding="UTF-8"?><Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{9CEDBBC7-5AF3-4A8B-AC68-49F1E0D8402A}</MessageId>
<SourceEndpoint>hwf</SourceEndpoint>
<DestinationEndpoint>HWF_ORDRSP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesOrderService/read</Action>
</Header>
<Body>
<MessageParts>
<SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<SalesTable class="entity">
<CustAccount>00003</CustAccount>
<DeliveryDate>2019-10-21</DeliveryDate>
<POMOrderId>0002539819</POMOrderId>
<PurchOrderFormNum>4500143886</PurchOrderFormNum>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesLine class="entity">
<ExtLineNum>10</ExtLineNum>
<ItemId>08201</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>20</ExtLineNum>
<ItemId>08236</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>Sent</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>30</ExtLineNum>
<ItemId>08238</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>40</ExtLineNum>
<ItemId>08254</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>CancelledBySales</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
</SalesTable>
</SalesOrder>
</MessageParts>
</Body>
</Envelope>
预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{9CEDBBC7-5AF3-4A8B-AC68-49F1E0D8402A}</MessageId>
<SourceEndpoint>hwf</SourceEndpoint>
<DestinationEndpoint>HWF_ORDRSP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesOrderService/read</Action>
</Header>
<Body>
<MessageParts xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<SalesTable class="entity">
<CustAccount>00003</CustAccount>
<DeliveryDate>2019-10-21</DeliveryDate>
<POMOrderId>0002539819</POMOrderId>
<PurchOrderFormNum>4500143886</PurchOrderFormNum>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesLine class="entity">
<ExtLineNum>10</ExtLineNum>
<ItemId>08201</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>30</ExtLineNum>
<ItemId>08238</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
</SalesTable>
</SalesOrder>
</MessageParts>
</Body>
</Envelope>
到目前为止我创建的 XSL:
<!-- Michael van den Dool 18-10-2019 17:46 filter saleslines -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder" exclude-result-prefixes="xs" version="2.0">
<!-- Copy everything -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- Match elements which need to be filtered and do not copy them to the output -->
<xsl:template match="SalesTable/SalesLine[not(SalesTable/SalesLine/SalesOrderStatus/text() = 'SalesOrder')]"/>
</xsl:stylesheet>
当运行 xsl 没有被过滤掉。我认为它在某个名称空间/层次结构中。但我还是xsl的业余爱好者,抱歉..
这是一个简单、简短的 XSLT 1.0 解决方案。
您的主要问题是未能在匹配模式中指定元素的名称空间 -- 它们不在 "no namespace"
中<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<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="x:SalesLine[not(x:SalesOrderStatus = 'SalesOrder')]"/>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{9CEDBBC7-5AF3-4A8B-AC68-49F1E0D8402A}</MessageId>
<SourceEndpoint>hwf</SourceEndpoint>
<DestinationEndpoint>HWF_ORDRSP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesOrderService/read</Action>
</Header>
<Body>
<MessageParts>
<SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<SalesTable class="entity">
<CustAccount>00003</CustAccount>
<DeliveryDate>2019-10-21</DeliveryDate>
<POMOrderId>0002539819</POMOrderId>
<PurchOrderFormNum>4500143886</PurchOrderFormNum>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesLine class="entity">
<ExtLineNum>10</ExtLineNum>
<ItemId>08201</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>20</ExtLineNum>
<ItemId>08236</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>Sent</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>30</ExtLineNum>
<ItemId>08238</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>40</ExtLineNum>
<ItemId>08254</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>CancelledBySales</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
</SalesTable>
</SalesOrder>
</MessageParts>
</Body>
</Envelope>
产生了想要的、正确的结果:
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{9CEDBBC7-5AF3-4A8B-AC68-49F1E0D8402A}</MessageId>
<SourceEndpoint>hwf</SourceEndpoint>
<DestinationEndpoint>HWF_ORDRSP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesOrderService/read</Action>
</Header>
<Body>
<MessageParts>
<SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder">
<SalesTable class="entity">
<CustAccount>00003</CustAccount>
<DeliveryDate>2019-10-21</DeliveryDate>
<POMOrderId>0002539819</POMOrderId>
<PurchOrderFormNum>4500143886</PurchOrderFormNum>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesLine class="entity">
<ExtLineNum>10</ExtLineNum>
<ItemId>08201</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1320.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
<SalesLine class="entity">
<ExtLineNum>30</ExtLineNum>
<ItemId>08238</ItemId>
<SalesId>QN00000949</SalesId>
<SalesOrderStatus>SalesOrder</SalesOrderStatus>
<SalesQty>1296.00</SalesQty>
<SalesUnit>st</SalesUnit>
<ShippingDateConfirmed>2019-10-21</ShippingDateConfirmed>
</SalesLine>
</SalesTable>
</SalesOrder>
</MessageParts>
</Body>
</Envelope>