XSLT 1.0 - Как сравнить возвращаемое значение position () со значением параметра - PullRequest
2 голосов
/ 26 октября 2011

еще одна викторина для изучения класса, в которой мне нужна помощь, чтобы сравнить возвращаемое значение position () со значением параметра следующим образом, используя XSLT 1.0. У меня есть этот простой XML ниже ...

<Providers>
    <Company>
        <Name>Alpha</Name>
    </Company>

    <Company>
        <Name>Beta</Name>
    </Company>

    <Company>
        <Name>Omega</Name>
    </Company>
</Providers>

И я хочу передать параметр с числовым значением, обозначающим уровень узла, чтобы вставить новый элемент с именем Rating, как этот ...

<Providers>
        <Company>
                <Name>Alpha</Name>
        </Company>

        <Company>
                <Name>Beta</Name>
                <Rating>Good</Rating>
        </Company>

        <Company>
                <Name>Omega</Name>
        </Company>
</Providers>

Вот мой XSLT ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

<xsl:param name="nodeNumber">2</xsl:param>


<xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="@*|node()"/>
    </xsl:copy>
</xsl:template>


<xsl:template match="Providers">
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
</xsl:template>


<xsl:template match="Company[ position() = 2 ]">
    <xsl:copy>
        <xsl:copy-of select="@*|node()"/>
        <Rating>Good</Rating>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Вместо жесткого кодирования ко второму узлу ...

<xsl:template match="Company[ position() = 2 ]">

Я хочу сделать такое сравнение, чтобы оно использовало значение параметра ...

<xsl:template match="Company[ position() = $nodeNumber ]">

но я получаю ошибку, если XSLT равен 1,0 ...

c:\ msxsl.exe providers.xml providers.xsl

Error occurred while compiling stylesheet 'providers.xsl'.

Code:   0x80004005
Variables may not be used within this expression.

Company[ position() = -->$nodeNumber <--]

работает нормально, если XSLT равен 2,0 ...

c:\ altovaxml.exe /xslt2 providers.xsl /in providers.xml

<?xml version="1.0" encoding="UTF-8"?>
<Providers>
        <Company>
                <Name>Verizon</Name>
        </Company>
        <Company>
                <Name>Sprint</Name>
                <Rating>Good</Rating>
        </Company>
        <Company>
                <Name>ATT</Name>
        </Company>
</Providers>

Мне нужно использовать XSLT 1.0. Большое спасибо за ваше время и усилия ...

1 Ответ

3 голосов
/ 26 октября 2011
<xsl:template match="Company">
   <xsl:copy>
     <xsl:copy-of select="@*|node()"/>
     <xsl:if test="(count(preceding-sibling::Company) + 1) = $nodeNumber">
        <Rating>Good</Rating>
     </xsl:if>
    </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...