XSLT Трансверс и отбор - PullRequest
       1

XSLT Трансверс и отбор

1 голос
/ 07 октября 2011

Я очень плохо знаком с xslt и мне нужна помощь с определенным фрагментом кода У меня есть файл XML: `

<in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
<!-- Function Call Result (0 ms), XPath /in:inputs/in:result[@name='SitemapXml']/Page-->
<in:result name="SitemapXml">
    <Page MenuTitle="Frontpage" UrlTitle="Home"  FolderPath="/Home" Depth="1"  xmlns="">
        <Page Depth="2" />
        <Page MenuTitle="Treadmills Reviews" UrlTitle="Treadmills-Reviews" Description=""  FolderPath="/Home/Treadmills-Reviews" Depth="2" isopen="true" iscurrent="true"  >
            <Page MenuTitle="Sole Fitness" UrlTitle="Sole-Fitness" Description=""  FolderPath="/Home/Treadmills-Reviews/Sole-Fitness" Depth="3">
                <Page MenuTitle="F-Series" UrlTitle="F-Series" Description=""  FolderPath="/Home/Treadmills-Reviews/Sole-Fitness/F-Series" Depth="4">
                    <Page MenuTitle="F63" UrlTitle="F63" Description=""  FolderPath="/Home/Treadmills-Reviews/Sole-Fitness/F-Series/F63" Depth="5" />
                </Page>
            </Page>
            <Page MenuTitle="Nordic Track" UrlTitle="Nordic-Track" Description=""  FolderPath="/Home/Treadmills-Reviews/Nordic-Track" Depth="3"/>
        </Page>
        <Page MenuTitle="Our Top Picks" UrlTitle="Our-Top-Picks" Description=""  FolderPath="/Home/Our-Top-Picks" Depth="2"/>
        <Page MenuTitle="Forums" UrlTitle="Forums" Description=""  FolderPath="/Home/Forums" Depth="2"/>
    </Page>
</in:result>

`

Я пытаюсь пересечь узлы с помощью xslt, а затем распечатать значение "MenuTitle" узла, которое "iscurrent = 'true'". Может быть любое количество уровней узлов "Page", а также атрибут iscurrent, в котором когда-либо открыта страница.

Мой файл xslt выглядит следующим образом `

 <xsl:template match="/">
  <html>
  <head>

  </head>

  <body>
<span>
    <xsl:apply-templates mode="HeaderName" select="."/>
</span>

  </body>
  </html>
 </xsl:template>

<xsl:template mode="HeaderName" match="*">
<xsl:if test="@iscurrent='true'">
    <xsl:value-of  select="@MenuTilte" />
</xsl:if>
</xsl:template>

</xsl:stylesheet>`

Что я делаю не так, если не все?

Заранее спасибо.

1 Ответ

0 голосов
/ 07 октября 2011

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

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

<xsl:template match="in:result">
<xsl:apply-templates select="//Page[@iscurrent = 'true']"/>
</xsl:template>

<xsl:template match="Page">

<xsl:message terminate="no">
  <xsl:value-of select="@MenuTitle"/>
</xsl:message>
</xsl:template>

</xsl:stylesheet>

При применении к вашему входному XML-файлу, который, как я полагаю, содержит некоторые ошибки форматирования, то есть комментарий является неправильным, поскольку он комментирует весь XML-файл и существует два корневыхelement (я рекомендовал первый)

Будет выводить сообщение:

[xslt] Treadmills Reviews

Конечно, в вашем случае вам придется использовать значение атрибута или в любом случае сделать что-то, чтосоответствует вашим потребностям.

Относительно вашего xslt.Убедитесь, что вы используете правильное пространство имен и что вы выбрали правильные узлы в элементе применения шаблонов.

Приведенный выше xsl предназначен только для целей тестирования.Измените вывод на html и удалите элемент сообщения.Youy в конечном итоге будет выглядеть примерно так:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
<xsl:output method="html" indent="yes"/>

<xsl:template match="in:result">
<html>
  <head>
    <title>Test</title>

  </head>
  <body>
    <span>
      <xsl:apply-templates select="//Page[@iscurrent = 'true']"/>
    </span>
  </body>
</html>
</xsl:template>

<xsl:template match="Page">

  <xsl:value-of select="@MenuTitle"/>

</xsl:template>

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