Как применить шаблон XSL только к элементам, содержащим дочерний элемент с определенным значением атрибута и значением элемента? - PullRequest
2 голосов
/ 24 августа 2009

У меня есть следующий 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 ]

2 голосов
/ 24 августа 2009

Мое предложение:

<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]
"/>

должно работать также (это не так очевидно, но это не так само по себе ). Не уверен, почему это не работает для вас.

0 голосов
/ 24 августа 2009
<xsl:apply-templates select="export/table[@name='CLIENT']/row/col[text()='1' and @name='PROSPECT']"/>
0 голосов
/ 24 августа 2009

Я попробовал ваши аппликационные шаблоны, и они не потерпели неудачу. Вы уверены, что ошибка в шаблонах apply?

0 голосов
/ 24 августа 2009

Осторожно: недоверчиво. Это может даже не правильно разобрать.

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

</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...