Удалить узел xml, где значение атрибута равно 0 с помощью xls - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь «убрать» узлы из xml, где одно из значений атрибута = 0 (количество).Мой ввод xml:

<?xml version="1.0" encoding="utf-16"?>
<StockAdjustments xmlns="http://example.com/IWS/StockAdjustments">
    <StockAdjustment Article="VL04604" Client="BHP" Status="PAXD" Unit="M2" Quantity="-96" ReasonCode="TELVERSCHI" Batch="VK00427062" HostLocation="BHP" />
    <StockAdjustment Article="VL04604" Client="BHP" Status="" Unit="M2" Quantity="0" ReasonCode="TELVERSCHI" Batch="VK00427062" HostLocation="BHP" />
</StockAdjustments>

Запрошенный / ожидаемый результат:

<?xml version="1.0" encoding="utf-16"?>
<StockAdjustments xmlns="http://example.com/IWS/StockAdjustments">
    <StockAdjustment Article="VL04604" Client="BHP" Status="PAXD" Unit="M2" Quantity="-96" ReasonCode="TELVERSCHI" Batch="VK00427062" HostLocation="BHP" />
</StockAdjustments>

После нескольких часов борьбы с пространствами имен как нубом я "создал" следующий xslt:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:iws="http://example.com/IWS/StockAdjustments"
    xmlns="http://example.com/IWS/StockAdjustments"
    excluxxde-result-prefixes="iws">
        <xsl:output method="xml" indent="yes" />
        <xsl:template match="/iws:StockAdjustments/iws:StockAdjustment[@Quantity != '0']">
           <xsl:copy>
                <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
         </xsl:template>
    </xsl:stylesheet>

Что дает мне

<?xml version="1.0" encoding="UTF-8"?>
    <StockAdjustment xmlns="http://example.com/IWS/StockAdjustments">VL04604BHPPAXDM2-96TELVERSCHIVK00427062BHP</StockAdjustment>

У меня такое ощущение, что я почти на месте, что мне нужно, чтобы получить требуемый результат?

Майк

[ОБНОВЛЕНИЕ С РЕШЕНИЕМ] Это правильный xslt для моей «проблемы» благодаря Майклу

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:iws="http://example.com/IWS/StockAdjustments">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/iws:StockAdjustments">
    <xsl:copy>
        <xsl:copy-of select="iws:StockAdjustment[@Quantity != 0]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

1 Ответ

0 голосов
/ 10 декабря 2018

Вот один способ взглянуть на это:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://example.com/IWS/StockAdjustments">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="StockAdjustment[@Quantity=0]"/>

</xsl:stylesheet>

Вот еще один:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://example.com/IWS/StockAdjustments">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/StockAdjustments">
    <xsl:copy>
        <xsl:copy-of select="StockAdjustment[@Quantity != 0]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
...