динамические несколько фильтров в xsl - PullRequest
1 голос
/ 03 декабря 2011
<list>
<field ows_ID="1081" Program="106;#Virginia" ProgramCategory="United States"/>
<field ows_ID="1082" Program="110;#NewYork" ProgramCategory="United States" />
<field ows_ID="1083" Program="106;#Texas;#112;#Virginia;#118;#Mass" ProgramCategory="United States" />
<field ows_ID="1084" Program="111;#Florida;#180;#Texas" ProgramCategory="United States" />
<field ows_ID="1085" Program="" ProgramCategory="Australia" />
<field ows_ID="1086" Program="122;#Sydney;#Melbourne" ProgramCategory="Australia" />
<field ows_ID="1087" Program="121;#Melbourne" ProgramCategory="Australia" />
<field ows_ID="1088" Program="118;#Mass" ProgramCategory="United States" />
<field ows_ID="1088" Program="123;#Brisbane" ProgramCategory="Australia" />


</list>

У меня есть какой-то xml, из которого мне нужно найти счетчик, где ProgramCategory равна некоторой стране, а Program не должна равняться некоторым состояниям, которые я получаю динамически из некоторого другого xml.Из другого xml я получаю Program, связанную с каждой ProgramCategory, а затем мне нужно отфильтровать xml с условием

foreach(list/field[@ProgramCategory=$Country][not(contain(@Program,$State1][not(contain(@Program,$State2][not(contain(@Program,$State3][not(contain(@Program,$State4])

Проблема в том, что я могу получить n no.штатов, через которые я прохожу цикл других xml.

Скажем, если я получил от другого xml, что штаты, связанные с Соединенными Штатами, - это Вирджиния, Техас и Флорида, то счетчик для Соединенных Штатов равен 2, и еслиЯ говорю, что штаты, ассоциируемые с Австралией, - это Мельбурн, Сидней и Брисбен, тогда количество составляет 1. Я использую xsl 1.0.

1 Ответ

1 голос
/ 03 декабря 2011

Хороший вопрос, + 1.

Я думаю, что нет ни одного выражения XPath 1.0 , которое оценило бы требуемое количество.

Здесьрешение XSLT 1.0 :

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

 <xsl:param name="pFilteredStates">
  <state>Virginia</state>
  <state>Texas</state>
  <state>Florida</state>
 </xsl:param>

 <xsl:param name="pCountry" select="'United States'"/>

 <xsl:variable name="vFiltered" select=
  "document('')/*/xsl:param[@name='pFilteredStates']/*
  "/>

 <xsl:template match="/">
  <xsl:variable name="vCount">
    <xsl:apply-templates select="*"/>
  </xsl:variable>

  <xsl:value-of select="string-length($vCount)"/>
 </xsl:template>

 <xsl:template match="field">
  <xsl:if test=
  "@ProgramCategory = $pCountry
  and
   not($vFiltered[contains(current()/@Program,
                           .
                           )
                 ]
      )
  ">
   <xsl:text>1</xsl:text>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML :

<list>
    <field ows_ID="1081" Program="106;#Virginia" ProgramCategory="United States"/>
    <field ows_ID="1082" Program="110;#NewYork" ProgramCategory="United States" />
    <field ows_ID="1083" Program="106;#Texas;#112;#Virginia;#118;#Mass" ProgramCategory="United States" />
    <field ows_ID="1084" Program="111;#Florida;#180;#Texas" ProgramCategory="United States" />
    <field ows_ID="1085" Program="" ProgramCategory="Australia" />
    <field ows_ID="1086" Program="122;#Sydney;#Melbourne" ProgramCategory="Australia" />
    <field ows_ID="1087" Program="121;#Melbourne" ProgramCategory="Australia" />
    <field ows_ID="1088" Program="118;#Mass" ProgramCategory="United States" />
    <field ows_ID="1088" Program="123;#Brisbane" ProgramCategory="Australia" />
</list>

требуемое, правильноерезультат получается :

2

II.Решение XPath 2.0 :

Следующее единственное выражение XPath 2.0:

count(
   for $f in /*/*,
       $w in $f
             [@ProgramCategory eq $pCountry
            and
              not($pFilteredStates/*
                           [contains($f/@Program, .)]
                  )
             ]
     return $w
      )

при оценке в том же документе XML (см. Выше) дает требуемый, правильный результат:

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