【问题标题】:XSL query tag based on value基于值的 XSL 查询标记
【发布时间】:2018-05-09 16:45:11
【问题描述】:

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 标记中插入名为“CFGCode”的列中的值。诀窍是我可能有不同的“调用”和不同的参数,所以我想确保我用正确的值填充 ID 标签,这就是为什么我试图将植物/ID 与参数 [name='id '] 从通话中。 如果这些值匹配,则从 CFGCode 中选择值。

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

谢谢!

编辑:

预期输出:

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

【问题讨论】:

  • 您的预期输出是什么样的?
  • 正如我所说,在 cfg/ID 标签中,我应该有来自 column[name='CFGCode'] 的值,因为 parameters/parameter[name='id'] 的值与植物/id。

标签: xml xslt


【解决方案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']"/>

【讨论】:

  • 谢谢。例如,如果我希望每个唯一列 [@name='CPCode'] 在不同的标签中选择来自 CPCapacity 的“单位”[磅和加仑]的值,我需要一个类似的键吗?我有兴趣为每个唯一的 CPCode 保存 CPCapacity 值
  • 如果您使用的是 XSLT 1.0,您应该阅读 Muenchian Grouping 以获取唯一值。如果您可以使用 XSLT 2.0,那会更好,请阅读 xsl:for-each-group
  • 谢谢。我通过使用 [not(.=preceding::*)] 获得了唯一值,但我不确定如何返回 CPCapacity 值...不幸的是我正在使用 XSLT 1.0
  • 在 cmets 中解释可能有点过多,所以请随意提出一个全新的问题,但绝对值得一读 Muenchian 分组,因为它比检查 preceding::* 更好通常。
  • 嗨,蒂姆,您能否就另一个问题提出建议 stackoverflow.com/questions/50261381/… ?非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多