Xml 基于值的XSL查询标记

Xml 基于值的XSL查询标记,xml,xslt,Xml,Xslt,XML输入: <?xml version="1.0" encoding="UTF-8"?> <root> <output> <calls> <call> <parameters> <parameter name="id">CTL-000002</parameter>

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>

CTL-000002
9500
CTL-3819
CTL-3819-01
2700
加仑
52120
CTL-3819
CTL-3819-01
22950
英镑
9500
CTL-3819
CTL-3819-02
1700
加仑
CTL-000002
0
XSL:


我不确定我做错了什么。
基本上,我想在cfg/id标记中插入名为“CFGCode”的列中的值。诀窍是,我可能会有不同参数的不同“调用”,因此我希望确保用正确的值填充ID标记,这就是为什么我要尝试将plant/ID与调用中的参数[name='ID']匹配。 如果这些值匹配,则从CFGCode中选择该值

最终目标是,我有多个具有不同信息的“plants”标记,我需要将plant ID与“call”中的ID匹配,以便从我的通话结果中选择一些信息(这些是查询的一些结果)

谢谢大家!

编辑:

预期产出:

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

CTL-3819
CTL-000002
0

您想要的表达式是

<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']"/>


您的预期输出是什么样子的?正如我所说,在cfg/ID标记中,我应该有[name='CFGCode']列中的值,因为参数/参数[name='ID']值与plant/ID相同。谢谢。例如,如果我想让每个唯一列[@name='CPCode']在不同的标记中从CPCapacity中选择'unit's[pound and galler]的值,我需要一个类似的键?我感兴趣的是为每个唯一的cpcode保存CPCapacity值。如果您使用的是XSLT1.0,您应该仔细阅读以获得唯一的值。如果您可以使用XSLT2.0(这会更好),请阅读
xsl:for each group
。谢谢。我通过使用[not(.=Previous::*)]获得了唯一的值,但我不确定如何返回CPCapacity值……不幸的是,我使用的是XSLT 1.0,这可能有点太多,无法在注释中解释,所以请随意提出一个全新的问题,但是关于门钦族的分组绝对值得一读,因为这是一个比通常检查
前面的::*
更好的选择。嗨,蒂姆,你能就另一个问题提出建议吗?非常感谢你。
<xsl:key name="calls" match="call" use="parameters/parameter[@name='id']" />
<xsl:value-of select="key('calls', id)/Results/ex/column[@name='CFGCode']"/>