我有一个 XSLT 1.0* 样式表,它进行一些预处理并创建一个由元素列表组成的结果片段<x>
,每个元素都有两个子元素 - 让我们调用 then<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() 将其转换为节点集,并使用 apply-templates 将所有<x>
元素转换为输出表示。
到目前为止,一切都很好。
match="*"
但是我必须在输出模板上使用规则,虽然我可以使用"*[1]"
and获取子元素,但我无法使用and"*[2]"
找到它们- 我只是得到一个空结果。"a"
"b"
位置语法可以作为一种解决方法,但它相当脆弱,我想将它改回处理元素名称。此外,它的可读性不是很高。
我确实怀疑这可能是一个命名空间问题(<x>
,<a>
并且<b>
没有在输入或输出文档的原始模式中定义),但据我所知,当使用“*”选择元素时没有命名空间装饰。
以防万一它很重要,我在 cygwin 下使用 xsltproc(libxml 20902、libxslt 10128 和 libexslt 817)。
关于我可能做错的任何想法或调试提示?
(*-我必须使用 XSLT 1.0,因为它设计为在 Web 浏览器中运行。)
编辑:根据要求添加示例
输入 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>