что является текущим () в предикате предиката - PullRequest
1 голос
/ 29 июля 2010

другой вопрос XPath / XSL:)

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

A

- B (anymal-types = домашние животные)

---- C (тип = птица)

---- C (type = cat)

---- C (тип = собака)

- B (рабочие животные)

---- C (тип = корова)

---- C (тип = слон)

-A
...

и другой xml-файл ($ xmlFile), в котором перечислены типы, которые нужны для данного anymal-типа

-ПЭТ

---- кошка

---- собака

-рабочая-животное

---- слон

как выбрать только тех животных, которым мне приказывает $ xmlFile ?:

что в данном случае current () относится к: - это узел, которому соответствует шаблон ("A") - или это текущий узел C оценивается.

Каков будет правильный способ добраться до текущего оцениваемого узла C и перейти на один узел вверх (к B, который определяет тип животного).

Спасибо.

1 Ответ

0 голосов
/ 30 июля 2010

Это преобразование :

<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:variable name="vrtfXmlFile">
     <pets>
       <animal>cat</animal>
       <animal>dog</animal>
     </pets>
     <working-animals>
       <animal>elephant</animal>
     </working-animals>
    </xsl:variable>

    <xsl:variable name="vxmlFile" select=
     "document('')/*/xsl:variable
                      [@name='vrtfXmlFile']"/>

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

 <xsl:template match="b">
   <xsl:if test="$vxmlFile/*[name()=current()/@animal-types]">
     <xsl:call-template name="identity"/>
   </xsl:if>
 </xsl:template>

 <xsl:template match="c">
  <xsl:if test=
    "$vxmlFile/*[name()=current()/../@animal-types]
                              /animal[.=current()/@type]">
   <xsl:call-template name="identity"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML :

<a>
 <b animal-types="pets">
   <c type="bird"/>
   <c type="cat"/>
   <c type="dog"/>
 </b>
 <b animal-types="working-animals">
   <c type="cow"/>
   <c type="elephant"/>
 </b>
</a>

дает желаемый, правильный результат :

<a>
   <b animal-types="pets">
      <c type="cat"/>
      <c type="dog"/>
   </b>
   <b animal-types="working-animals">
      <c type="elephant"/>
   </b>
</a>

Примечания

  1. Для удобства второй документ, содержащий разрешенных животных, включен в таблицу стилей XSLT. На практике можно использовать функцию document(some-uri) для чтения, анализа и определения ее как содержимого переменной $vxmlFile.

  2. Если список разрешенных животных очень длинный, то использование мюнхенской группировки (ключей) будет значительно более эффективным.

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