Xml 具有不同属性的XSLT连接

Xml 具有不同属性的XSLT连接,xml,xslt,xpath,Xml,Xslt,Xpath,我的输入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" />

我的输入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 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>

我希望我的输出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 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>

菜单价格200.0
常规菜单项212.2
经核准的
常规菜单项
5.
常规菜单项200.0
拒绝
常规菜单项
3.
这是我应用于它的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”。本质上,我正在寻找一个XPath查询,当且仅当@outputname中的字符串包含“菜单价格”时,@outputname(在我的示例中为200.0)中的值与相应的@id_价格(200.0)相匹配

类似于此(这是不正确的):


有人能推荐一个XPath来满足我的需要吗?

您可以这样做:

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

更好的方法可能是定义:


然后将其用作:

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


谢谢@michael.hor257k。这让我非常接近。但是我仍然缺少FoodOutput/Parent的第二个子行元素的outputvalue属性值。该值应为“5”。我在此处的输出:。这是因为“212.0”与“212.2”不匹配。比较:超级。只要一个小小的改变,就会有很大的不同。再次感谢@michael.hor257k。你又一次帮了我大忙。