使用xpath和xsl遍历xml文档

时间:2017-07-21 02:43:23

标签: xslt xpath xsl-fo

我正在使用XSL和XPATH来遍历,读取和转换复杂的XML文件,其中我有多个具有相同名称但值不同的节点。我的示例xml文件位于 -

之下
    <core>
   <address>
      <postalZipCode>90017</postalZipCode>
      <updateSource>xxxxxx</updateSource>
      <city>LOS ANGELES</city>
      <stateProvince>CA</stateProvince>
      <type>MAILING</type>
      <line1>818 WEST SEVENTH STREET</line1>
   </address>
   <address>
      <postalZipCode>95014</postalZipCode>
      <updateSource>xxxxxx</updateSource>
      <city>CUPERTINO</city>
      <stateProvince>CA</stateProvince>
      <type>PRIMARY</type>
      <line1>1234 XYZ STREET</line1>
   </address>
    <memberId>0</memberId>
 </core>

当我读取MAILING ADDRESS第1行值时,我得到的值是&#34; 1234 XYZ STREET&#34;这基本上是主要的地址。这是我的xsl文件片段: -

    <xsl:template match="core">       
    <xsl:if test="memberId['0'] and address/type['MAILING']">
    <fo:table-row>
        <fo:table-cell><fo:block /></fo:table-cell>                     
        <fo:table-cell xsl:use-attribute-sets="data">
            <fo:block>Line 1</fo:block>
        </fo:table-cell>
        <fo:table-cell xsl:use-attribute-sets="data">
            <fo:block><xsl:value-of select="address/line1/text()"/>
        </fo:block>
        </fo:table-cell>                                              
    </fo:table-row>

这里的专家能否建议是否有其他方法可以强制XSL读取地址为MAILING的正确值,而不是读取它找到的第一个值???

2 个答案:

答案 0 :(得分:1)

  

如果有任何其他方法可以强制XSL读取正确的   地址为MAILING的值,而不是读取第一个值   它找到???

您的问题相当令人困惑,因为MAILING 是您示例中的第一个地址 - 而您显示的代码段会产生您说的结果。

在任何情况下,为了确保从MAILING地址获取数据而不管其位置如何,请更改:

<xsl:value-of select="address/line1/text()"/>

为:

<xsl:value-of select="address[type='MAILING']/line1"/>

要了解其工作原理,请详细了解predicates

答案 1 :(得分:1)

你写的代码说&#34;如果有一个MAILING类型的地址,那么打印地址/ line1的值(无论这是否与MAILING类型的地址有任何关联)&#34 ;

在XSLT 1.0中,当xsl:value-of选择多个节点时,它会显示找到的第一个节点的值。在XSLT 2.0中,它将所有选定节点的值连接起来,并使用一个默认为单个空格的分隔符。

如果有多个节点并且您想要选择一个特定的节点,请使用谓词选择它,例如xsl:value-of select="address[@type='MAILING']/line1