我正在使用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的正确值,而不是读取它找到的第一个值???
答案 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
。