如何仅对包含具有特定属性值和元素值的子元素的元素应用XSL模板?

时间:2009-08-24 14:05:52

标签: xml xslt xpath

我有以下XML(部分)文档:

<export>
<table name="CLIENT">
    <row>
        <col name="CODE_CLIENT" type="System.String">1000010026</col>
       <col name="LIBELLE" type="System.String">Test|</col>
        <col name="PROSPECT" type="System.Decimal">1</col>
    </row>
    <row>
        <col name="CODE_CLIENT" type="System.String">1000010025</col>
        <col name="LIBELLE" type="System.String">Rue de la 2eme ad|</col>
        <col name="PROSPECT" type="System.Decimal">0</col>
    </row>
    <row>
        <col name="CODE_CLIENT" type="System.String">1000010125</col>
       <col name="LIBELLE" type="System.String">Test4</col>
        <col name="PROSPECT" type="System.Decimal">0</col>
    </row>
    <row>
        <col name="CODE_CLIENT" type="System.String">1000010035</col>
        <col name="LIBELLE" type="System.String">Rue</col>
        <col name="PROSPECT" type="System.Decimal">1</col>
    </row>
    </table></export>

以及以下XSL:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="export/table[@name='CLIENT']"/>

  </xsl:template>

  <xsl:template match="row">
        SOME TEMPLATE CODE

  </xsl:template>


</xsl:stylesheet>

我想将第一个模板(match =“/”)仅应用于前景值为1的“行”。在我的例子中,只会转换第一行和最后一行。

我试过

<xsl:apply-templates select="export/table[@name='CLIENT']/row[col[@name='PROSPECT']=1]"/>

但这给了我一个语法错误。

任何人都知道如何继续?

4 个答案:

答案 0 :(得分:2)

我的建议:

<xsl:stylesheet 
  version="1.1" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="text" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="export/table[@name='CLIENT']"/>
  </xsl:template>

  <xsl:template match="table">
    <xsl:apply-templates select="row[col[@name='PROSPECT' and text() = '1']]" />
  </xsl:template>

  <xsl:template match="row">
    SOME TEMPLATE CODE
  </xsl:template>

</xsl:stylesheet>

虽然你的尝试:

<xsl:apply-templates select="
  export/table[@name='CLIENT']/row[col[@name='PROSPECT']=1]
"/>

也应该工作(它不是那么明显,但它没有错误本身)。不知道为什么它不适合你。

答案 1 :(得分:0)

小心:未经测试。它甚至可能无法正确解析。

<xsl:template match="row[string(./col[@name='PROSPECT']) = '1']">

</xsl:template>

答案 2 :(得分:0)

我尝试了你的apply-templates,但没有失败。你确定错误在apply-templates中吗?

答案 3 :(得分:0)

<xsl:apply-templates select="export/table[@name='CLIENT']/row/col[text()='1' and @name='PROSPECT']"/>