Как создать оглавление со всеми уровнями иерархии? - PullRequest
2 голосов
/ 12 августа 2010

Учитывая следующий XML-документ:

<Include>
  <Feature Title="A">
    <Feature Title="1" />
    <Feature Title="2" />
  </Feature>
  <Feature Title="B">
    <Feature Title="3">
      <Feature Title="i" />
      <Feature Title="ii" />
    </Feature>
    <Feature Title="4" />
  </Feature>
</Include>

Мне нужно создать текстовый файл, который выглядит следующим образом:

; Header

A
A/1
A/2
B
B/3
B/3/i
B/3/ii
B/4

Моя лучшая попытка добиться этого - таблица стилей XSL:

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

  <xsl:template match="/">
    <xsl:text>; Header&#x0A;&#x0D;&#x0A;&#x0D;</xsl:text>
    <xsl:apply-templates select="//Feature" /></xsl:template>

  <xsl:template match="Feature">
    <xsl:value-of select="@Title" /><xsl:text>&#x0A;&#x0D;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

Но это генерирует вывод:

; Header

A
1
2
B
3
i
ii
4

Как мне получить все уровни иерархии, присутствующие в выводе?

1 Ответ

10 голосов
/ 12 августа 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="Include">
        <xsl:text>; Header&#xA;&#xA;</xsl:text>
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="Feature">
        <xsl:param name="pPrevious" select="''"/>
        <xsl:value-of select="concat($pPrevious,@Title,'&#xA;')"/>
        <xsl:apply-templates>
            <xsl:with-param name="pPrevious" select="concat($pPrevious,@Title,'/')"/>
        </xsl:apply-templates>
    </xsl:template>
</xsl:stylesheet>

Вывод:

; Header

A
A/1
A/2
B
B/3
B/3/i
B/3/ii
B/4

Просто для удовольствия, одна строка XPath 2.0:

concat('; Header&#xA;&#xA;',
       string-join(/Include//Feature/string-join(
            ancestor-or-self::Feature/@Title,'/'),
           '&#xA;')
      )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...