鉴于此XML来源:
<?xml version="1.0"?>
<modsCollection xmlns="http://www.loc.gov/mods/"
xmlns:mods="http://www.loc.gov/mods/" version="3.0">
<mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mods="http://www.loc.gov/mods/"
xsi:schemaLocation="http://www.loc.gov/mods/ http://www.loc.gov/standards/mods/mods.xsd">
<titleInfo>
<title>Mutant sex party :</title>
<subTitle>& other plays</subTitle>
</titleInfo>
<name type="personal">
<namePart xmlns:xlink="http://www.w3.org/TR/xlink">Macdonald, Ed</namePart>
<role>
<text>creator</text>
</role>
</name>
</mods>
</modsCollection>
并给出了这个XSL样式表:
<?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">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/modsCollection">
<xsl:apply-templates select="mods" />
</xsl:template>
<xsl:template match="mods">
<ul>
<xsl:apply-templates select="titleInfo" />
</ul>
</xsl:template>
<xsl:template match="title">
<li><xsl:value-of select="." /></li>
</xsl:template>
</xsl:stylesheet>
我应该获得UL标题列表。相反,我只回到剥离的文本节点。是什么赋予了?我在某处做过蠢事吗?
~Erik
答案 0 :(得分:4)
您需要考虑默认的命名空间xmlns="http://www.loc.gov/mods/"
,使用像Saxon 9或AltovaXML这样的XSLT 2.0处理器,只需将xpath-default-namespace="http://www.loc.gov/mods/"
放在xsl:stylesheet
元素上即可。
使用XSLT 1.0处理器,您需要将代码更改为
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:df="http://www.loc.gov/mods/"
exclude-result-prefixes="df"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/df:modsCollection">
<xsl:apply-templates select="df:mods" />
</xsl:template>
<xsl:template match="df:mods">
<ul>
<xsl:apply-templates select="df:titleInfo" />
</ul>
</xsl:template>
<xsl:template match="df:title">
<li><xsl:value-of select="." /></li>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:3)
源文档中的根元素是
<modsCollection xmlns="http://www.loc.gov/mods/"
因此它(及其所有未加前缀的后代)都在此命名空间中,并且不匹配
<xsl:template match="/modsCollection">
您需要向xmlns:mods
元素添加xsl:stylesheet
声明此命名空间,并在模板匹配表达式和apply-templates
选择表达式中使用前缀
<xsl:template match="/mods:modsCollection">