У меня есть таблица стилей XSLT 1.0*, которая выполняет некоторую предварительную обработку и создает фрагмент результата, состоящий из списка элементов <x>
, каждый из которых имеет двух дочерних элементов — давайте тогда назовем <a>
и <b>
.
Итак, сгенерированный список выглядит так:
<x><a>A-content</a><b>B-content</b></x>
<x><a>A-content</a><b>B-content</b></x>
...
<x><a>A-content</a><b>B-content</b></x>
Затем я преобразовываю это в набор узлов с помощью node-set() и использую шаблоны применения для преобразования всех элементов <x>
в выходное представление.
Все идет нормально.
Но я должен использовать правило match="*"
в выходном шаблоне, и хотя я могу получить дочерние элементы, используя "*[1]"
и "*[2]"
, я не могу найти их, используя "a"
и "b"
- я просто получаю пустой результат.
Позиционный синтаксис работает как обходной путь, но он довольно ненадежен, и я хотел бы вернуться к работе с именами элементов. Кроме того, это не очень читабельно.
Я подозревал, что это может быть проблема с пространством имен (<x>
, <a>
и <b>
не определены в исходной схеме для входных или выходных документов), но, насколько я вижу, при выборе элементов с помощью " *".
На всякий случай, если это важно, я использую xsltproc под cygwin (libxml 20902, libxslt 10128 и libexslt 817).
Любые идеи о том, что я могу делать неправильно, или советы по отладке?
(*- Мне приходится использовать XSLT 1.0, поскольку он предназначен для работы в веб-браузере.)
РЕДАКТИРОВАТЬ: добавлены примеры по запросу
Введите test.xml:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="test.xsl" type="text/xsl" ?>
<books>
<book>
<title>Diaspora</title>
<author>Greg Egan</author>
</book>
<book>
<title>2001</title>
<author>Arthur C Clarke</author>
</book>
<book>
<title>Eon</title>
<author>Greg Bear</author>
</book>
</books>
Преобразование test.xslt:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:exslt="http://exslt.org/common"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:msxslt="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="xsl msxslt exslt xalan">
<!-- extension-element-prefixes="exslt"> -->
<xsl:template match="books">
<!-- Generate list -->
<xsl:variable name="list">
<xsl:apply-templates select="book" mode="phase1"/>
</xsl:variable>
<html>
<head>
<title>Books</title>
</head>
<body>
<xsl:choose>
<xsl:when test="function-available('msxslt:node-set')">
<xsl:apply-templates select="msxslt:node-set($list)" mode="process-list"/>
</xsl:when>
<xsl:when test="function-available('exslt:node-set')">
<xsl:apply-templates select="exslt:node-set($list)" mode="process-list"/>
</xsl:when>
<xsl:when test="function-available('xalan:nodeset')">
<xsl:apply-templates select="xalan:nodeset($list)" mode="process-list"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="$list" mode="process-list"/>
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>
<xsl:template match="book" mode="phase1">
<!-- Actual transformation is more involved -->
<xsl:element name="x">
<xsl:element name="a">
<b>
<xsl:value-of select="author/text()"/>
</b>
</xsl:element>
<xsl:element name="b">
<i>
<xsl:value-of select="title/text()"/>
</i>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="*" mode="process-list">
<p>
[<xsl:value-of select="*[1]"/>]
[<xsl:value-of select="*[2]"/>]
[<xsl:value-of select="a"/>]
[<xsl:value-of select="b"/>]
</p>
</xsl:template>
</xsl:stylesheet>
Выходные данные (одинаковые выходные данные как для msxslt, так и для xsltproc):
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Books</title></head>
<body>
<p>
[Greg Egan]
[Diaspora]
[]
[]
</p><p>
[Arthur C Clarke]
[2001]
[]
[]
</p><p>
[Greg Bear]
[Eon]
[]
[]
</p>
</body>
</html>
xml-namespaces
. Не стесняйтесь отменить это изменение, если вы не согласны. - person Mathias Müller   schedule 12.02.2016<a>
и<b>
назначаются дополнительные пространства имен, нет. Если я запускаю это в отладчике XSLT в Visual Studio, я также не вижу мошеннических пространств имен. И все же названное совпадение... не соответствует. - person Sean Ellis   schedule 12.02.2016<xsl:element name="a" namespace="ln">
, то оно появится в выводе как<a xmlns="ln"><b xmlns="http://www.w3.org/1999/xhtml">Greg Bear</b></a>
, чего я и ожидал, но совпадение с явным использованием пространства имен —"ln:a"
— по-прежнему ничего не возвращает. - person Sean Ellis   schedule 12.02.2016