В XPATH используйте данные из текущего контекста для фильтрации других данных - PullRequest
1 голос
/ 28 августа 2009

Есть ли способ использовать данные из текущего контекста для фильтрации узлов где-то еще в источнике статистики.

Например, если у меня есть этот XML:

<root>
    <group1>
        <inst>
            <type>Foo</type>
            <value>First Foo</value>
        </inst>
        <inst>
            <type>Bar</type>
            <value>The Bar</value>
        </inst>
        <inst>
            <type>Foo</type>
            <value>Second Foo</value>
        </inst>
    </group1>
    <group2>
        <Filter>
            <FilterType>Foo</FilterType>
        </Filter>
        <Filter>
            <FilterType>Bar</FilterType>
        </Filter>
    </group2>
</root>

Предполагая, что мой контекст является одним из тегов фильтра, я хочу получить число экземпляров указанного типа в group1. Я хотел бы написать XPATH, который выглядит примерно так:

count(/root/group1/inst[type = **FilterType**])

Могу ли я использовать что-нибудь, чтобы получить FilterType в исходном контексте?

Ответы [ 2 ]

1 голос
/ 28 августа 2009

Это легко сделать в XPath 2.0 :

for $type in /*/*/Filter[1]/FilterType
  return 
     count(/*/group1/*[type eq $type])

Когда это выражение Xpath сравнивается с предоставленным XML-документом, возвращается правильный результат:

2

В XPath 1.0, если количество элементов group1/inst известно заранее, а $ vType обозначает рассматриваемый FilterType, тогда можно построить следующее выражение XPath 1.0:

  ($vType = /*/group1/inst[1]/type)
 +
  ($vType = /*/group1/inst[2]/type)
 +
  ($vType = /*/group1/inst[3]/type)

, который снова производит:

2

Наконец, если в XSLT необходимо выражение XPath 1.0, а «Filter» является текущим узлом,

тогда следующее выражение XPath вычисляет точное количество совпадений:

  count(/*/group1/inst[type = curent()/FilterType])
0 голосов
/ 01 июня 2011

Я ищу решение той же проблемы. В настоящее время я использую переменную, чтобы обойти это ... это будет выглядеть примерно так:

<xsl:variable name='FilterType'><xsl:value-of select='FilterType'/></xsl:variable>
<xsl:value-of select='count(/root/group1/inst[type = $FilterType])'/>

Но должен быть лучший способ.

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