В чем ошибка в моем XSLT? - PullRequest
       3

В чем ошибка в моем XSLT?

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

Это мой xml-файл

<html xmlns="http://www.w3schools.com">
    <body>
        <shelf>
            <cd id="el01">
                <artist>Elton John</artist>
                <title>Circle of Life</title>
                <country>UK</country>
                <company>Spectrum</company>
                <price>10.90</price>
                <year>1999</year>
                <description>As heard in the Lion King.</description>
            </cd>

            <book id="bk101">
                <author>Gambardella, Matthew</author>
                <title>XML Developer's Guide</title>
                <genre>Computer</genre>
                <price>44.95</price>
                <publish_date>2000-10-01</publish_date>
                <description>An in-depth look at creating applications 
      with XML.
                </description>
            </book>

          </shelf>
    </body>
</html>

Это мой XSL-файл

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

<!-- TODO customize transformation rules 
     syntax recommendation http://www.w3.org/TR/xslt 
-->
<xsl:template match="/">
    <html>
        <head>
            <title>The Shelf</title>
        </head>
        <body>
            <h1>The Shelf</h1>
            <xsl:apply-templates select="shelf"/>
        </body>
    </html>
</xsl:template>
<xsl:template match="//shelf">
    <xsl:for-each select="cd|book">
        <xsl:value-of select="title"/>
    </xsl:for-each>
</xsl:template>

Мой вывод - просто "Полка" в браузере.Где я не прав?

Ответы [ 3 ]

6 голосов
/ 22 октября 2011

У вас две проблемы.

  1. Ваши данные имеют пространство имен "http://www.w3schools.com",, однако вы не можете просто объявить это в своем xslt и использовать его - из-за несоответствия в спецификациях xml / xpath вам также необходимо изменить селекторы. I Вы объявили префикс «data», чтобы он соответствовал пространству имен по умолчанию для ваших XML-документов, а затем изменил все выбранные вами значения xpath. К сожалению, вы не можете просто использовать пространство имен по умолчанию, так как пространства имен по умолчанию не работают в xpath. вы могли бы удалить пространство имен по умолчанию из вашего XML-документа, но это не всегда возможно).

  2. Ваш селектор полки не найдет подходящих узлов относительно '/'. Я изменил ваши первоначальные шаблоны применения на // data: shelf, чтобы соответствовать всем узлам data: shelf, которые можно найти в любом месте вашего документа.

попробуйте следующее

<xsl:stylesheet xmlns:data="http://www.w3schools.com" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>

<!-- TODO customize transformation rules
 syntax recommendation http://www.w3.org/TR/xslt
-->
<xsl:template match="/">
<html>
    <head>
        <title>The Shelf</title>
    </head>
    <body>
        <h1>The Shelf</h1>
        <xsl:apply-templates select="//data:shelf"/>
    </body>
</html>
</xsl:template>
<xsl:template match="//data:shelf">
<xsl:for-each select="data:cd|data:book">
    <p><xsl:value-of select="data:title"/></p>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>
0 голосов
/ 22 октября 2011

Ваша строка <xsl:apply-templates select="shelf"/> будет применяться в контексте корневого узла (т. Е. Html / shelf).На этом уровне нет полочных узлов.

Достаточно изменить эту строку на <xsl:apply-templates select="body/shelf"/>.

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

Ваш выбор = "полка" неверна. Должно работать, если вы просто удалите его. Или попробуйте выбрать = "html / body / shelf".

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