XSLT:两个节点上的测试条件

时间:2016-10-11 17:36:29

标签: xslt xpath

如果满足以下条件,我需要创建一个额外的节点:

如果不是(TYPE =' WE' AND' CH' =' true')   - >创建新节点MISSING

来源:

<?xml version="1.0" encoding="UTF-8"?>
<Partner>
    <NR>10</NR>
    <SR>
        <PF>
            <TYPE>WE</TYPE>
            <NR>2345</NR>
            <CH>false</CH>
        </PF>
        <PF>
            <TYPE>WE</TYPE>
            <NR>111</NR>
            <CH>false</CH>
        </PF>
        <PF>
            <TYPE>RG</TYPE>
            <NR>999</NR>
            <CH>true</CH>
        </PF>
    </SR>
    <SR>
    ...
    </SR>
</Partner>

期望的输出:

<?xml version="1.0" encoding="UTF-8"?>
<Partner>
    <NR>10</NR>
    <SR>
        <PF>
            <TYPE>WE</TYPE>
            <NR>2345</NR>
            <CH>false</CH>
        </PF>
        <PF>
            <TYPE>WE</TYPE>
            <NR>111</NR>
            <CH>false</CH>
        </PF>
        <PF>
            <TYPE>RG</TYPE>
            <NR>999</NR>
            <CH>true</CH>
        </PF>
        <XX>MISSING</XX>
    </SR>
    <SR>
    ...
    </SR>
</Partner>

我真的很难创建这个测试条件 - 我需要检查两个节点的内容:

<xsl:if test="not(./PF/TYPE = 'WE' and CH = 'true')">

我需要确保在<CH>上下文中评估<TYPE> = 'WE',但我不知道如何执行此操作...

我的xslt看起来像这样:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<xsl:template match="Partner">
<PARTNER>

    <xsl:for-each select="./SR">
           <SR>
           ...

           <xsl:copy-of select= "./PF">

           <xsl:if test="not(./PF/TYPE = 'WE' and CH = 'true')">
             <XX>MISSING</XX>
           </xsl:if>

           </SR>
    </xsl:for-each>

</PARTNER>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

您需要找到满足条件的PF节点,而不是多个节点可以满足的复杂表达式。

<xsl:if test="not(./PF[TYPE = 'WE' and CH = 'true'])">
    <XX>MISSING</XX>
</xsl:if>

此处,表达式./PF[cond]找到满足条件PF的{​​{1}}节点。在该节点的上下文中评估所需条件cond