【问题标题】:XSLT-XPath: Check if value exists in listXSLT-XPath:检查列表中是否存在值
【发布时间】:2013-09-12 22:27:59
【问题描述】:

我已经看到了一些检查值(节点)是否存在于列表(循环 XML 变量)中的不同方法的示例,但由于某种原因,我无法弄清楚我需要的 Xpath 语句的确切语法要使用。我有一个 XML 文档是发票行列表,另一个 XML 文档是错误行列表。如果第一个文档中的值存在于第二个文档中,我需要将其替换为“X”值,否则留空。

这是一个示例输入文档

输入1

<?xml version="1.0" encoding="UTF-8"?>
<UPSOutboundFlatFileSchema>
    <data>
        <processFlag>1</processFlag>
        <field1>...</field1>
        <field2>...</field2>
    </data>
    <data>
        <processFlag>2</processFlag>
        <field1>...</field1>
        <field2>...</field2>
    </data>
    <data>
        <processFlag>3</processFlag>
        <field1>...</field1>
        <field2>...</field2>
    </data>
    <data>
        <processFlag>4</processFlag>
        <field1>...</field1>
        <field2>...</field2>
    </data>
</UPSOutboundFlatFileSchema>

输入2

<?xml version="1.0" encoding="UTF-8"?>
<rows>
    <row>
        <LineNumber>2</LineNumber>
    </row>
    <row>
        <LineNumber>3</LineNumber>
    </row>
</rows>

输出文档

<?xml version="1.0" encoding="UTF-8"?>
<UPSOutboundFlatFileSchema>
    <data>
        <processFlag></processFlag>
        <field1>...</field1>
        <field2>...</field2>
    </data>
    <data>
        <processFlag>X</processFlag>
        <field1>...</field1>
        <field2>...</field2>
    </data>
    <data>
        <processFlag>X</processFlag>
        <field1>...</field1>
        <field2>...</field2>
    </data>
    <data>
        <processFlag></processFlag>
        <field1>...</field1>
        <field2>...</field2>
    </data>
</UPSOutboundFlatFileSchema>

这是我目前拥有的 XSLT,我只是无法在第一个“当 test =”正确时获得 XPath 语句...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output indent="yes"/>
    <xsl:variable name="rejectLines" select="bpws:getVariableData('UPSDataRejectLineNumbers')"/>
    <xsl:variable name="input" select="/"/>

    <xsl:template match="/">

        <xsl:element name="UPSOutboundFlatFileSchema">    
            <xsl:for-each select="$input/*:UPSOutboundFlatFileSchema/*:data">
                <xsl:element name="data">
                    <xsl:choose>
                        <xsl:when test="boolean($rejectLines/*:rows/*:row/*:LineNumber = processFlag">
                            <xsl:element name="processFlag">
                                <xsl:value-of select="X"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:element name="processFlag">
                                <xsl:value-of select="''"/>
                            </xsl:element>                
                        </xsl:otherwise>
                    </xsl:choose>
                    <xsl:copy-of select="child::*[not(self::processFlag)]"/>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>    
    </xsl:template>

</xsl:stylesheet>

【问题讨论】:

    标签: xml xslt xpath filtering xslt-2.0


    【解决方案1】:

    不要太用力地踢自己,但是有&lt;xsl:value-of select="X"/&gt; 的地方需要&lt;xsl:text&gt;X&lt;/xsl:text&gt;。您的输入数据中没有名为 X 的元素。

    当您使用它时,您只需要&lt;xsl:element name="processFlag"/&gt;

    如果您只有一个字符串参数,则不需要&lt;xsl:value-of/&gt;

    【讨论】:

    • 嗯,这是有道理的......我肯定是想多了(并且一开始就拥有 Xpath 权利)。肯定吸取了教训,再次感谢肯的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2020-06-15
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多