Как получить все результаты, если есть несколько совпадений: XSL - PullRequest
1 голос
/ 30 января 2012

Я практикую некоторые XSL и использую этот XML-документ в качестве простого примера:

<?xml version="1.1" encoding="UTF-8"?>

<zoo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="zoo.xsd" >
    <animals>
        <animal type="lion">
            <name>Zeus</name>
            <gender>M</gender>
            <eats>antelope</eats>
            <eats>monkey</eats>
        </animal>
        <animal type="monkey">
            <name>Fredo</name>
            <gender>M</gender>
            <eats>banana</eats>
            <iseatenby>lion</iseatenby>
        </animal>
        <animal type="lion">
            <name>Here</name>
            <gender>F</gender>
            <eats>antelope</eats>
            <eats>monkey</eats>
        </animal>
        <animal type="antelope">
            <name>Annie</name>
            <gender>F</gender>
            <eats>grass</eats>
            <iseatenby>lion</iseatenby>
        </animal>
        <animal type="elephant">
            <name>Moses</name>
            <gender>M</gender>
            <eats>leaves</eats>
        </animal>
    </animals>
</zoo>

Мне удалось получить некоторую основную информацию с помощью моего XSL-документа, но сейчас я застрял на одном: как мне получить всех результатов, если их более одного? Например, в моем документе у некоторых животных есть несколько элементов «поедания». Я хочу отобразить их в строке через запятую; в конце концов я хочу преобразовать элементы каждого животного в атрибуты и просто иметь один атрибут для каждого. (Используя мой предыдущий пример, атрибут «ест» нового льва элемента животных будет выглядеть так: eats="antelope, monkey")

Может кто-нибудь объяснить, как я мог бы сделать что-то подобное с XSL ?? Буду признателен за любую оказанную помощь. :)

Ответы [ 2 ]

2 голосов
/ 30 января 2012

не идеально, хотя:)

попробуйте сейчас, надеюсь, это поможет .. Я конвертирую каждый элемент как атрибут ..

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="//animal">
    <xsl:copy>
      <!--copies all other elements as attributes-->
      <xsl:for-each select="*[name()!='eats']">
        <xsl:attribute name="{name()}">
          <xsl:apply-templates select = "text()"/>
        </xsl:attribute>
      </xsl:for-each> 

      <xsl:attribute name="eats">

        <!-- Go to <eats/> node -->
        <xsl:for-each select="eats">

          <!--insearts string ", " if it has preceding values already :) -->
          <xsl:if test="preceding-sibling::eats">
            <xsl:text>, </xsl:text>
          </xsl:if>

          <!--copies all the text :) -->
          <xsl:apply-templates select="text()"/>

        </xsl:for-each>
      </xsl:attribute>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
1 голос
/ 30 января 2012

Используйте это:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="zoo/animals">
    <xsl:copy>
      <xsl:apply-templates select="animal"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="animal">
    <xsl:copy>
      <xsl:attribute name="eats">
        <xsl:for-each select="eats">
          <xsl:value-of select="."/>

          <xsl:if test="position() != last()">
            <xsl:text>,</xsl:text>
          </xsl:if>
        </xsl:for-each>
      </xsl:attribute>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Ссылка:

Функция position возвращает число, равное позиции контекста, из контекста вычисления выражения.Функция last возвращает число, равное размеру контекста, из контекста оценки выражения.

xsl:if проверяет, является ли текущий узел последним узлом в контексте.Если это так, выходы ,.

http://www.w3.org/TR/xpath/#function-last

...