在XSLT中,如何根据另一个子节点的值显示子节点的值

时间:2013-12-11 15:39:42

标签: xml xslt

我正在尝试使用XSLT将一个XML文档转换为另一个XML文档。

原始XML的格式如此;

<NodeList>
    <Node>
      <Type>Commercial</Type>
      <ContactDetail>
        <Name>The Shop</Name>
        <Line01>1 The Lane</Line01>
        <Line02></Line02>
        <Line03>London</Line03>
        <PostCode>SW11AA</PostCode>
        <TelMobile>07777123456</TelMobile>
      </ContactDetail>
    </Node>
    <Node>
      <Type>Municiple</Type>
      <ContactDetail>
        <Name>Some place</Name>
        <Line01>1 Hub Lane</Line01>
        <Line02>PLYMOUTH</Line02>
        <Line03>DEVON</Line03>
        <Line04></Line04>
        <PostCode>PL62BB<</PostCode>
        <TelMobile>01234567890</TelMobile>
      </ContactDetail>
    </Node>
<NodeList>

我需要能够打印NodeList / Node [Type ='Commercial']的详细联系方式,但就我而言,我找不到正确的方法。

我想到了一些事情;

<xsl:value-of select="NodeList/Node/[Type='Commercial"]/ContactDetails/Name" />

但当然“ContactDetails”不是“Type”的孩子。

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

正确的语法是NodeList/Node[Type='Commercial']/ContactDetails/Name

答案 1 :(得分:2)

你走在正确的轨道上。删除Node和您的条件之间的斜杠。这样您就可以选择与括号中的条件匹配的Node元素。

NodeList/Node[Type="Commercial"]/ContactDetail/Name

此外,条件是检查'商业',这将从引号中给你一个错误,并且xpath的结尾正在寻找ContactDetails而不是ContactDetail,这就是你的例子。这两个都被纠正了在上面的查询中。

答案 2 :(得分:0)

如果您需要访问重复的节点,可以使用xsl:key,例如:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:key name="nodeTypeKey" match="Node" use="Type" />

   <xsl:template match="/">
      <xsl:variable name="addressToUse" 
                    select="key('nodeTypeKey', 'Commercial')/ContactDetail">
      </xsl:variable>
      <Name><xsl:value-of select="$addressToUse/Name"/></Name>
      <Tel><xsl:value-of select="$addressToUse/TelMobile"/></Tel>
      <!-- etc -->
   </xsl:template>
</xsl:stylesheet>