基于值

时间:2018-05-09 16:45:12

标签: xml xslt

XML输入:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <output>
        <calls>
            <call>
                <parameters>
                    <parameter name="id">CTL-000002</parameter>
                </parameters>
                <Results>
                    <ex id="1">
                        <column name="CFGCapacity">9500.0000000</column>
                        <column name="CFGCode">CTL-3819</column>
                        <column name="CPCode">CTL-3819-01</column>
                        <column name="CPCapacity">2700</column>
                        <column name="unit">gallon</column>
                    </ex>
                    <ex id="2">
                        <column name="CFGCapacity">52120.0000000</column>
                        <column name="CFGCode">CTL-3819</column>
                        <column name="CPCode">CTL-3819-01</column>
                        <column name="CPCapacity">22950</column>
                        <column name="unit">pound</column>
                    </ex>
                    <ex id="3">
                        <column name="CFGCapacity">9500.0000000</column>
                        <column name="CFGCode">CTL-3819</column>
                        <column name="CPCode">CTL-3819-02</column>
                        <column name="CPCapacity">1700</column>
                        <column name="unit">gallon</column>
                    </ex>
                </Results>
            </call>
        </calls>
    </output>
    <plant>
        <id>CTL-000002</id>
        <plant_tag>0</plant_tag>
    </plant>
</root>

XSL:

<xsl:template match="@* | node()">
    <root>
        <xsl:for-each select="//plant">
            <xsl:choose>
                <xsl:when test="plant_tag='0'">
                    <cfgs>
                        <cfg>
                            <id>
                                <xsl:value-of select="//root/output/calls/call/parameters[parameter[@name='id'] = ./id]/../../Results/ex/column[@name='CFGCode']"/>
                            </id>
                        </cfg>
                    </cfgs>
                    <xsl:copy-of select="."/>
                </xsl:when>
                <xsl:otherwise>
                    <!--smthing else-->
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </root>
</xsl:template>
</xsl:stylesheet>

我不确定我做错了什么 基本上,我想在cfg / id标签中插入名称为&#39; CFGCode&#39;的列中的值。诀窍是我可能有不同的电话&#39;使用不同的参数,所以我想确保我使用正确的值填充ID标记,这就是我试图将工厂/ ID与参数[name =&#39; id&#39;]匹配的原因来自电话。 如果这些值匹配,则从CFGCode中选择值。

最终目标是,我有多种植物&#39;标签,具有不同的信息,我需要将工厂ID与来自&#39;呼叫的工厂ID相匹配。为了从我的通话结果中选择一些信息(这些是查询的一些结果)。

谢谢!

编辑:

预期产出:

<root>
<plant>
    <cfgs>
        <cfg>
            <id>CTL-3819</id>
        </cfg>
    </cfgs>
    <id>CTL-000002</id>
    <plant_tag>0</plant_tag>
</plant>
</root>

1 个答案:

答案 0 :(得分:1)

你想要的表达是......

<xsl:value-of select="//root/output/calls/call/parameters[parameter[@name='id'] = current()/id]/../Results/ex/column[@name='CFGCode']"/>

注意使用current()/id而不是./id,因为current()指的是plant的当前节点,而xpath条件中的.指的是parameter ..节点。

另请注意,您只需../..而不是<xsl:value-of select="//root/output/calls/call[parameters/parameter[@name='id'] = current()/id]/Results/ex/column[@name='CFGCode']"/>

但是,您可以将表达式简化为...

<xsl:key name="calls" match="call" use="parameters/parameter[@name='id']" />

或者更好地定义一个像这样的键......

<xsl:value-of select="key('calls', id)/Results/ex/column[@name='CFGCode']"/>

然后你可以这样做......

OWA_UTIL.REDIRECT_URL