XSL: Количество номеров работает не так, как ожидалось. Проблема с моим XPath? - PullRequest
1 голос
/ 04 мая 2011

Вот XML

<row>
    <cell>blah blah</cell>

    <check>
        <option/>
        <option/>
        <option/>
        <option/>
        <option/>
        <option/>
    </check>
</row>

Вот XSL

<xsl:template match="row">
    <xsl:variable name="inputLevel">
        <xsl:number count="option" level="any" from="."/>
    </xsl:variable>

    <xsl:value-of select="$inputLevel"/>
</xsl:template>

Все, что я получаю, это "0".http://www.w3schools.com/XPath/xpath_syntax.asp говорит "."означает текущий узел.Разве он не должен возвращать «6»?

Edit1: я хотел искать теги опций на ЛЮБОМ уровне, а не просто проверять.Должен был объяснить, но теги параметров могут существовать на любом уровне ниже

Ответы [ 3 ]

3 голосов
/ 04 мая 2011

Если вы хотите считать потомка option s, вы не должны использовать xsl:number, но:

<xsl:variable name="inputLevel" select="count(.//option)"> 
2 голосов
/ 04 мая 2011

Из спецификации XSLT 1.0 W3C :

"Если не указан атрибут value, вставляется xsl:number elementчисло, основанное на положении текущего узла в исходном дереве. Следующие атрибуты управляют нумерацией текущего узла:

Атрибут level указывает, какие уровни исходного дерева должныучитывается, он имеет значения single, multiple или any. По умолчанию это single.

Атрибут count - это шаблон, который указывает, какие узлы должны учитываться на этих уровнях.Если атрибут count не указан, то по умолчанию используется шаблон, соответствующий любому узлу с тем же типом узла, что и текущий узел, и, если текущий узел имеет расширенное имя, с таким же расширенным именем, что и текущий узел

Когда level="any", он создает список длиной один, содержащий количество узлов, которые соответствуют шаблону count и принадлежат к набору, содержащему текущий узел и все узлы на любом уровне.документа, находящегося перед текущим узлом в порядке документа, исключая любые узлы пространства имен и атрибутов (другими словами объединение членов предыдущей оси и оси ancestor-or-self ).Если указан атрибут from, то учитываются только узлы после первого узла перед текущим узлом, соответствующие шаблону from.".

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

В этом вопросе текущийузел является верхним узлом элемента row и имеет 0 предков и 0 предшествующих узлов элемента.

Следовательно, возвращаемый результат верен!

Solution :

Использование:

count(descendant::option)

Результатом вычисления этого выражения является количество всех option элементов в документе, которые являются потомками текущего узла (элемент row).

2 голосов
/ 04 мая 2011

Я думаю, что проблема в том, что выражение xpath option не будет ничего соответствовать элементу row - попробуйте вместо этого:

<xsl:number count="check/option" level="any" from="." />

Чтобы найти элементы option на любом уровнеиспользуйте следующий синтаксис:

<xsl:number count="//option" level="any" from="." />

Я не думаю, что атрибут from требуется, и атрибут level, вероятно, не делает то, что вы думаете (я тоже не уверенчто он делает ...)

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