我为xsl:模板和名称空间的第100个问题道歉。我确实阅读了其他问题(例如here,here和here),但仍然无法将这些问题放在一起。
这是我的意见:
<?xml version="1.0" encoding="UTF-8" ?>
<AuthorIT version="6.2.0" xmlns="http://www.authorit.com/xml/authorit"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.authorit.com/xml/authorit AuthorIT.xsd">
<Objects>
<Book>
<Object>
<Description>1089-802-01</Description>
</Object>
</Book>
</Objects>
</AuthorIT>
这是我的样式表:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ait="http://www.authorit.com/xml/authorit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.authorit.com/xml/authorit AuthorIT.xsd">
<xsl:template match="/">
<Table>
<apply-templates/>
</Table>
</xsl:template>
<xsl:template match="ait:Book">
<Row>
<Cell>
<Data><xsl:value-of select="./Object/Description"/></Data>
</Cell>
</Row>
</xsl:template>
预期结果:
<Table>
<Row>
<Cell>
<Data>1089-802-01</Data>
</Cell>
</Row>
</Table>
实际结果:
<Table>
1089-802-01
</Table>
换句话说,xsl:template match =&#34; /&#34;匹配,但xsl:模板匹配=&#34; ait:Book&#34;没有。
如何匹配Book元素?
请注意,我从输入根元素AuthorIT xmlns =&#34; http://www.authorit.com/xml/authorit" 中取出了默认命名空间,并将其添加到样式表为 xmlns:ait =&#34; http://www.authorit.com/xml/authorit" 。 然后我尝试将Book元素与 ait:Book 相匹配。但我必须误解this answer。
我不知道它是否重要,但我使用的是Saxon HE 9和Notepad ++ XML插件。
答案 0 :(得分:0)
好<apply-templates/>
是一个文字结果元素,您需要<xsl:apply-templates/>
。但我没有得到你说的结果(http://xsltransform.net/ej9EGcB),我得到了
<?xml version="1.0" encoding="UTF-8"?><Table xmlns:ait="http://www.authorit.com/xml/authorit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><apply-templates/></Table>
清楚地表明您只需创建一个带有Table
子元素的apply-templates
元素。
答案 1 :(得分:0)
正如Martin Honnen已经指出的那样,使用您的代码收到的实际结果并不是您所声称的。
无论如何,要获得预期结果,您必须更改
<receiver
android:name=".Salva_autostart"
android:enabled="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter>
<action android:name="com.xxx.my_filter_intent" />
</intent-filter>
</receiver>
为:
<xsl:value-of select="./Object/Description"/>
因为这些元素也在给定的命名空间中。
您还应该添加<xsl:value-of select="./ait:Object/ait:Description"/>
作为exclude-result-prefixes="ait"
元素的属性,并删除那里的冗余命名空间声明。
这是xsl:stylesheet
与<apply-templates/>
问题的补充。
当然,您需要关闭<xsl:apply-templates/>
代码。
答案 2 :(得分:0)
谢谢大家的答案。
我做了以下事情:
xmlns:ait="http://www.authorit.com/xml/authorit"
声明添加到样式表标记。ait:
前缀。exclude-result-prefixes="ait"
。它现在有效,虽然我不明白exclude-result-prefixes="ait"
的作用:转换在有和没有它的情况下都很顺利。也许是未来研究的主题。
<apply-templates/>
与<xsl:apply-templates/>
问题以及结束</xsl:stylesheet>
标记是在简化帖子文件时插入的拼写错误。对此感到抱歉,感谢你指出。
特别感谢Martin Honnen与http://xsltransform.net的链接:我不知道它存在并且非常方便。
答案 3 :(得分:-1)
尝试使用
<xsl:apply-templates/>
(你错过了&#34; xsl:&#34;) 和
<xsl:template match="AuthorIT/Object/Books">
而不是&#34; ait:Book&#34;。 这应该可以解决问题。