XSLT и пространство имен по умолчанию для вывода XHTML - PullRequest
4 голосов
/ 19 марта 2012

Я пытаюсь выяснить, как префиксы пространства имен процесса XSLT и имеют следующий пример: XML:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" 
    xmlns:zno="http://feed.zinio.com/atom" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.w3.org/2005/Atom 
                      http://www.w3.org/1999/xhtml 
                      http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd
                      http://feed.zinio.com/atom" >
    <entry>
        <author>
            <name>By Sheila F. Buckmaster</name>
        </author>
        <category xml:lang="en" term="TRAVEL"/>
        <content>
            <h2 class="hl2">One of the world’s most entrancing cities becomes even more captivating when costumed revelers fill its tiny streets and grand piazzas during Carnevale. It is here that a star of the silent screen comes alive, antics and all</h2>
            <div class="byline">By Sheila F. Buckmaster</div>
        </content>
   </entry>
</feed>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xslt:stylesheet version="1.0" xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
                           xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                           xmlns:user="urn:my-scripts"
                           xmlns:x="http://www.w3.org/1999/xhtml" 
                           xmlns:AP="http://www.w3.org/2005/Atom"
                           exclude-result-prefixes="xslt msxsl user">

    <xslt:output method="xml" indent="yes"/>
    <xslt:template match="/">
        <xslt:apply-templates select="/AP:feed//AP:entry"/>
    </xslt:template>

    <xslt:template match="AP:entry">
        <xslt:text>Hello from entry</xslt:text>
        <xslt:apply-templates select="AP:content"/>
    </xslt:template>

    <xslt:template match="AP:content">
        <xslt:text>Hello from content</xslt:text>
        <xslt:apply-templates select="x:div[@class='byline']"/>
    </xslt:template>

    <xslt:template match="x:div[@class='byline']">
        <xslt:copy-of select="."/>
    </xslt:template>
</xslt:stylesheet>

Что я пытаюсь сделать, эточтобы получить доступ к моему "div".Шаблоны "Entry" и "Content" работают нормально, так как я явно указал пространство имен.Но когда я пытаюсь получить доступ к «div» с помощью префикса XHTML (в моем случае «x») - XSLT не видит его.Это работает только тогда, когда я префикс "div" элемента с пространством имен "AP":

    <xslt:template match="AP:content">
        <xslt:text>Hello from content</xslt:text>
        <xslt:apply-templates select="AP:div[@class='byline']"/>
    </xslt:template>

    <xslt:template match="AP:div[@class='byline']">
        <xslt:copy-of select="."/>
    </xslt:template>

Но это не выглядит мне правильно, потому что элемент DIV должен быть в пространстве имен XHTML.Что я тут не так делаю?

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Фид Atom имеет пространство имен Atom, объявленное в корневом элементе без префикса пространства имен.<div/> и другие элементы XHTML наследуют пространство имен Atom, поскольку они не имеют явно объявленного пространства имен XHTML.

Если вы хотите, чтобы элементы XHTML были связаны с пространством имен XHTML, вам необходимо изменить<div> в фиде Atom должно быть:

<div xmlns:xhtml="http://www.w3.org/1999/xhtml" class="byline">By Sheila F. Buckmaster</div>

или:

<xhtml:div class="byline">By Sheila F. Buckmaster</xhtml:div>

Если вы сохраните фид Atom таким же и по-прежнему хотите создавать элементы XHTML, то вам потребуетсянастроить таблицу стилей так, чтобы она соответствовала AP:div, а затем создать элементы XHTML в выходных данных.

Например, изменив таблицу стилей I apply-templates для сопоставленного AP:div в режиме с именем xhtml.В любом режиме в этом режиме есть сопоставление с шаблоном (поэтому оно также будет работать для AP:h2), которое создает элементы XHTML, используя local-name() соответствующего элемента.

<?xml version="1.0" encoding="UTF-8"?>
<xslt:stylesheet version="1.0" xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:user="urn:my-scripts"
    xmlns:x="http://www.w3.org/1999/xhtml" 
    xmlns:AP="http://www.w3.org/2005/Atom"
    exclude-result-prefixes="xslt msxsl user">

    <xslt:output method="xml" indent="yes"/>
    <xslt:template match="/">
        <xslt:apply-templates select="/AP:feed//AP:entry"/>
    </xslt:template>

    <xslt:template match="AP:entry">
        <xslt:text>Hello from entry</xslt:text>
        <xslt:apply-templates select="AP:content"/>
    </xslt:template>

    <xslt:template match="AP:content">
        <xslt:text>Hello from content</xslt:text>
        <xslt:apply-templates select="AP:div[@class='byline']"/>
    </xslt:template>

    <xslt:template match="AP:div[@class='byline']">
        <xslt:apply-templates select="." mode="xhtml"/>
    </xslt:template>

    <!--create an XHTML element with the same name as the context element -->
    <xslt:template match="*" mode="xhtml">
        <xslt:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml">
            <xslt:apply-templates select="@*|node()" mode="xhtml"/>
        </xslt:element>
    </xslt:template>

    <!--attributes, comments, and processing-instructions simply copied -->
    <xslt:template match="@*|text()|comment()|processing-instruction()">
        <xslt:copy-of select="."/>
    </xslt:template>

</xslt:stylesheet>
2 голосов
/ 19 марта 2012

В вашем xml ваш div должен быть xhtml: div

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