选择XML文档的XSL不显示信息

时间:2017-03-29 15:15:30

标签: xml xslt-1.0

为什么这不起作用?

<?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中选择一个文档..

2 个答案:

答案 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变体,则可以应用此命令(安装程序xsltprocxmlindent):

xsltproc b.xslt b1.xml | xmlindent

答案 1 :(得分:1)

您在XML的开头设置了xmlns,因此默认情况下,您附加的URI为http://www.publictalksoftware.co.uk/msa的命名空间。

如果您想快速修复,请删除此xmlns声明,并且您的XSLT应该正常运行。

否则,解决方案将是:

  1. 在样式表的开头声明名称空间:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msa="http://www.publictalksoftware.co.uk/msa">(我使用 msa ,但可以使用任何前缀)
  2. 将您的XPath更改为<xsl:apply-templates select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher"/>