2016-08-19 4 views
0

У меня есть простой скрипт XSLT:XSL- простой пример не удается

<?xml version='1.0'?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="/package"> 
    <xsl:copy-of select="*"/> 
</xsl:template> 
</xsl:stylesheet> 

Что при нанесении на следующем примере

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<package 
    xmlns="http://www.idpf.org/2007/opf" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:dcterms="http://purl.org/dc/terms/" 
    version="3.0" 
    xml:lang="en" 
    unique-identifier="pub-identifier" 
> 
    <metadata> 
     <dc:identifier id="pub-identifier">_idm462750791920</dc:identifier> 
     <meta id="meta-identifier" property="dcterms:identifier">_idm462750791920</meta> 
    </metadata> 
</package> 

производит, не результат бы бессмысленно

<?xml version="1.0"?> 


_idm462750791920 
_idm462750791920 

Примечание что я не использую элементы, связанные с пространством имен dc, все работает так, как можно было бы ожидать. Например, если я использую:

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<package 
    xmlns="http://www.idpf.org/2007/opf" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:dcterms="http://purl.org/dc/terms/" 
    version="3.0" 
    xml:lang="en" 
    unique-identifier="pub-identifier" 
> 
<metadata> 
    asdfasdfads 
</metadata> 
</package> 

Так что похоже, что это признание элемент «пакет» и действующий на нем, как я ожидал.

Что мне нужно сделать, чтобы сделать эту работу?

+1

'/ package' ничего не соответствует, потому что пакет находится в пространстве имен по умолчанию. Сделайте быстрый поиск по пространству имен xslt по умолчанию, и вы найдете множество примеров.Кроме того, бессмысленный результат обусловлен встроенными шаблонами xslt. Когда я вернусь к компьютеру, я добавлю ссылку на спецификации. –

+0

Что * * ожидаемый результат здесь? –

+0

@michail - Я ожидаю получить отображение всего текста внутри элемента пакета. –

ответ

0

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

Что вы ожидали? Это приведет к следующему выходу:

<?xml version="1.0" encoding="utf-8"?> 

     asdfasdfads 

Который не то, что я ожидал бы от <xsl:copy-of select="*"/> если /package был выбран правильно.

Таким образом, кажется, что он распознает элемент «пакет» и действует на него, как я ожидаю.

Нет, извините, что нет. То, что вы видите, является результатом XSLT's built-in template rules.

Элемент /package находится в пространстве имен по умолчанию http://www.idpf.org/2007/opf. Что вы можете сделать, это связать это пространство имен uri с префиксом и использовать его в своих XPath (в match).

Примечание. Префикс, который вы используете, не имеет значения, до тех пор, пока ури одинаковы.

Пример ...

XSLT-1,0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:opf="http://www.idpf.org/2007/opf"> 
    <xsl:template match="/opf:package"> 
    <xsl:copy-of select="*"/> 
    </xsl:template> 
</xsl:stylesheet> 

Выход первого примера ввода:

<metadata xmlns="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"> 
    <dc:identifier id="pub-identifier">_idm462750791920</dc:identifier> 
    <meta id="meta-identifier" property="dcterms:identifier">_idm462750791920</meta> 
</metadata> 

Выход вашего второго входного примера:

<metadata xmlns="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"> 
    asdfasdfads 
</metadata> 

Если какой-либо из этих вариантов отличается от ожидаемого для вывода, пожалуйста, обновите свой вопрос с точным результатом, который вы ожидаете/хотите.