XSLT / XPath: исключение узлов из того, что было выбрано - PullRequest
1 голос
/ 27 марта 2012

Я хочу выбрать список узлов, который соответствует определенным критериям, и после обработки этих узлов я бы хотел выбрать остальные. Как я могу сделать это в XSLT и XPath.

Ниже приведен сценарий, у меня есть этот xml

<books>
<book name="Basic XML">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="Basic XML">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
<book name="Basic XSLT">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="Basic XSLT">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
<book name="Basic Java">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="Basic Java">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
<book name="Web Service">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="C Programming">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
</books>

1. Выберите все узлы <book> с <type> в «Учебнике», ниже вывод

<books>
<book name="Basic XML">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>   
<book name="Basic XSLT">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
<book name="Basic Java">
    <type>Tutorial</type>
    <grouping>A</grouping>
</book>
</books>

2. Затем выберите другие <book> узлы, которые не имеют <type> "Tutorial" и не совпадают с @name, как те, которые выбраны в # 1, вывод только:

<books>
<book name="Web Service">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
<book name="C Programming">
    <type>Educational</type>
    <grouping>A</grouping>
</book>
</books>

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Для первого запроса:

<xsl:apply-templates select="/books/book[type='Tutorial']"/>

Для второго запроса:

<xsl:apply-templates select="/books/book[type!='Tutorial']"/>

Тогда вам понадобятся соответствующие шаблоны для их обработки:

<xsl:template match="/books/book[type='Tutorial']">
   Do Something...
</xsl:template>

и последняя часть будет проверять, есть ли у текущего узла также обучающий узел

<xsl:template match="/books/book[type!='Tutorial']">
   <xsl:variable name="bookname">
      <xsl:value-of select="@name"/>
   </xsl:variable>
   <xsl:if test="count('/books/book[@name=$bookname and type='Tutorial']')=0">
      Do Something...
   </xsl:if>
</xsl:template>
0 голосов
/ 27 марта 2012

Вот полное решение :

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

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

 <xsl:template match="/*">
  <xsl:variable name="vTutBooks" select="book[type = 'Tutorial']"/>
  <books>
   <xsl:apply-templates select="$vTutBooks"/>
  </books>

  <books>
   <xsl:apply-templates select=
   "book[not(type = 'Tutorial')
       and
         not(@name = $vTutBooks/@name)
        ]"/>
  </books>
 </xsl:template>
</xsl:stylesheet>

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

<books>
    <book name="Basic XML">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic XML">
        <type>Tutorial</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic XSLT">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic XSLT">
        <type>Tutorial</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic Java">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
    <book name="Basic Java">
        <type>Tutorial</type>
        <grouping>A</grouping>
    </book>
    <book name="Web Service">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
    <book name="C Programming">
        <type>Educational</type>
        <grouping>A</grouping>
    </book>
</books>

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

<books>
   <book name="Basic XML">
      <type>Tutorial</type>
      <grouping>A</grouping>
   </book>
   <book name="Basic XSLT">
      <type>Tutorial</type>
      <grouping>A</grouping>
   </book>
   <book name="Basic Java">
      <type>Tutorial</type>
      <grouping>A</grouping>
   </book>
</books>
<books>
   <book name="Web Service">
      <type>Educational</type>
      <grouping>A</grouping>
   </book>
   <book name="C Programming">
      <type>Educational</type>
      <grouping>A</grouping>
   </book>
</books>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...