为什么这不起作用?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:variable name="PubDB" select="document('MSA_PublisherDatabase.XML')"/>
<table>
<xsl:apply-templates select="$PubDB/PublisherDatabase/Publishers/Publisher"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="Publisher">
<tr>
<td>
<xsl:value-of select="Name"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
XML文件包含以下内容:
<?xml version="1.0" encoding="utf-8"?>
<PublisherDatabase xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.publictalksoftware.co.uk/msa">
<Publishers>
<Publisher Gender="Male" Appointed="MinisterialServant" Serving="Publisher">
<Name>Fred Junior</Name>
<Notes />
<Availability Midweek="true" Weekend="true">
<DatesNotAvailable />
<DefaultExclusions />
</Availability>
<Assignments Attendant="true" ConductorCBS="false" ReaderCBS="true" Chairman="false" Microphones="true" PlatformAttendant="true" Prayer="true" OCLM="true" Sound="true" Student="true" Demonstrations="false">
<CustomAssignments />
</Assignments>
</Publisher>
</Publishers>
</PublisherDatabase>
在这种情况下,我希望它能给我一个名单。什么都没有出现。
我特意试图在我的XSL中选择一个文档..
答案 0 :(得分:2)
如评论中所述,您有命名空间问题:XSLT的命名空间和XML 不匹配。
我使用第三个.XML
文件创建了一个解决方案:
third.xml 很简单,仅用于XSLT开始处理:
<?xml version="1.0" encoding="utf-8"?>
<root>
</root>
您的名为MSA_PublisherDatabase.XML
的XML文件可以保持原样 - 根据需要。
但要获得所需的结果,必须像这样调整XSLT文件以正确处理命名空间问题:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msa="http://www.publictalksoftware.co.uk/msa"
exclude-result-prefixes="msa">
<xsl:output method="xml" />
<xsl:template match="/root">
<html>
<body>
<xsl:variable name="PubDB" select="document('MSA_PublisherDatabase.XML')"/>
<table>
<xsl:apply-templates select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="msa:Publisher">
<tr>
<td>
<xsl:value-of select="msa:Name"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
在这些修改之后,输出应该是/是:
<?xml version="1.0"?>
<html>
<body>
<table>
<tr>
<td>Fred Junior</td>
</tr>
</table>
</body>
</html>
如果您正在使用某些Linux变体,则可以应用此命令(安装程序xsltproc
和xmlindent
):
xsltproc b.xslt b1.xml | xmlindent
答案 1 :(得分:1)
您在XML的开头设置了xmlns
,因此默认情况下,您附加的URI为http://www.publictalksoftware.co.uk/msa
的命名空间。
如果您想快速修复,请删除此xmlns
声明,并且您的XSLT应该正常运行。
否则,解决方案将是:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msa="http://www.publictalksoftware.co.uk/msa">
(我使用 msa ,但可以使用任何前缀)<xsl:apply-templates select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher"/>