【问题标题】:XSLT Concatenation with Different Attributes具有不同属性的 XSLT 连接
【发布时间】:2015-07-15 22:06:15
【问题描述】:

我的输入 XML 如下所示:

<data>
    <Food_Output FoodNbr="171179">
        <Parent>
            <row outputname="Menu Price 200.0" outputvalue="3" costvalue="0" outputid="26" send_to_kitchen="1" adjusted="0" id_server="42" />
            <row outputname="Menu Price 212.0" outputvalue="5" costvalue="0" outputid="26" send_to_kitchen="1" adjusted="0" id_server="42" />
        </Parent>
    </Food_Output>
    <Food_Input FoodNbr="171179">
        <Parent>
            <row id_price="212.2" text_cmnt1="Approved" text_cmnt2="Regular Menu Item"/>
            <row id_price="200.0" text_cmnt1="Declined" text_cmnt2="Regular Menu Item"/>
        </Parent>
    </Food_Input>
</data>

我希望我的输出 XML 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<addtn_kitchen_data>
   <test>Menu Price 200.0</test>
   <tblGuests>
      <desc_adjmt_type>Regular Menu Item 212.2</desc_adjmt_type>
      <text_credit_apprl>Approved</text_credit_apprl>
      <text_cmnts>Regular Menu Item</text_cmnts>
      <nbr_adjmt>5</nbr_adjmt>
   </tblGuests>
   <tblGuests>
      <desc_adjmt_type>Regular Menu Item 200.0</desc_adjmt_type>
      <text_credit_apprl>Declined</text_credit_apprl>
      <text_cmnts>Regular Menu Item</text_cmnts>
      <nbr_adjmt>3</nbr_adjmt>
   </tblGuests>
</addtn_kitchen_data>

这是我正在应用的 XSLT 以尝试获取该输出:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <addtn_kitchen_data>
            <test>
                <xsl:value-of select="data/Food_Output/Parent/row[@id_server='42']/@outputname"/>
            </test>
            <xsl:for-each select="data/Food_Input/Parent/row">
                    <xsl:choose>
                        <xsl:when test="@id_price">
                            <tblGuests>
                                <desc_adjmt_type><xsl:value-of select="@text_cmnt2"/><xsl:text> </xsl:text> <xsl:value-of select="@id_price"/>
                                </desc_adjmt_type>
                                <text_credit_apprl><xsl:value-of select="@text_cmnt1"/></text_credit_apprl>
                                <text_cmnts><xsl:value-of select="@text_cmnt2"/></text_cmnts>
                                <nbr_adjmt>
                                    <xsl:value-of select="/data/Food_Output/Parent/row[@outputname='Menu Price 200.0']/@outputvalue"/>
                                </nbr_adjmt>
                            </tblGuests>
                        </xsl:when>
                        <xsl:otherwise>
                        </xsl:otherwise>
                    </xsl:choose>
            </xsl:for-each>
        </addtn_kitchen_data>
    </xsl:template>
</xsl:stylesheet>

现在我将 XSLT 中的 @outputname 硬编码为等于“菜单价格 200.0”。本质上,当且仅当@outputname 中的字符串包含“菜单价格”时,我正在寻找将@outputname(在我的示例中为200.0)中的值与相应的@id_price (200.0) 匹配的XPath 查询。

类似这样的事情(这是不正确的):

<xsl:value-of select="/data/Quote_Output/Parent/row[@outputname='Menu Price" & @id_grd & "']/@outputvalue"/>

谁能推荐一个 XPath 来满足我的需求?

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    可以这样做:

    <nbr_adjmt>
        <xsl:value-of select="/data/Food_Output/Parent/row[@outputname=concat('Menu Price ', current()/@id_price)]/@outputvalue"/>
    </nbr_adjmt>
    

    更好的方法可能是定义key

    <xsl:key name="row-by-price" match="row" use="substring-after(@outputname, 'Menu Price ')" />
    

    然后将其用作:

    <nbr_adjmt>
        <xsl:value-of select="key('row-by-price', @id_price)/@outputvalue"/>
    </nbr_adjmt>
    

    【讨论】:

    • 谢谢@michael.hor257k。这让我超级接近。但是我仍然缺少 FoodOutput/Parent 的第二个子行元素的 outputvalue 属性值。该值应为“5”。我在这里的输出:xsltransform.net/eiZQaG5.
    • 那是因为“212.0”与“212.2”不匹配。比较:xsltransform.net/eiZQaG5/1
    • 超级。只是一个小小的改变就会产生很大的不同。再次感谢@michael.hor257k。你又给了我很大的帮助。
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2019-12-13
    • 2020-09-05
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    相关资源
    最近更新 更多