XSLT - 选择一个元素的子元素,其中1个子元素='x',另一个子元素包含'y'

时间:2014-05-15 10:08:17

标签: xml xslt contains

我试图选择一行的特定子元素,其中另一个子元素等于某个值,另一个子元素包含一个值。我的XML如下所示:

<row>
   <field1>HEAD</field1>
   <field2/>
   <field3>123,456,789,000</field3>
   <field4>hello</field4>
   <field5/>
</row>

我的目标是让<field4/>的值<field1/> = HEAD<field3/> contains '789'

到目前为止,我已尝试过以下似乎不起作用的内容:

<xsl:variable name="myVar" select="789"/>
<xsl:value-of select="row[field1 = 'HEAD' and contains(field3, $myVar)]/field4"/>

有谁能发现我在这里做错了什么?提前谢谢。

2 个答案:

答案 0 :(得分:1)

我在以下样式表中尝试了您的代码:

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

    <xsl:output indent="yes"/>

    <xsl:variable name="myVar" select="789"/>

    <xsl:template match="/">
        <xsl:value-of select="row[field1 = 'HEAD' and contains(field3, $myVar)]/field4"/>
    </xsl:template>

</xsl:stylesheet>

它工作正常,输出hello

答案 1 :(得分:1)

查看您的变量设置 - 如果您要分配文字select="'789'",则应为'789'

   <xsl:template match="/">
      <xsl:variable name="myVar" select="'789'" />
      <xsl:value-of select="row[field1 = 'HEAD' 
                          and contains(field3, $myVar)]/field4"/>
   </xsl:template>

修改:澄清

  <xsl:variable name="myVar" select="z123" />

如果文档如下所示,将分配元素z123的值(即789

<row>
   <z123>789</z123>
   <field1>HEAD</field1>

尽管

  <xsl:variable name="myVar" select="'z123'" />

指定文字z123我猜测原始789的工作原因是因为xml元素不能以数字开头而且解析器假定是字面值。请参阅@ michael关于数字文字为什么起作用的解释