1

鉴于此 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>&amp; 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 标题列表。相反,我只取回剥离的文本节点。是什么赋予了?我在这里的某个地方做了什么愚蠢的事情吗?

〜埃里克

4

2 回答 2

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>
于 2013-06-03T17:50:17.137 回答
3

源文档中的根元素说

<modsCollection xmlns="http://www.loc.gov/mods/" 

因此它(及其所有无前缀的后代)都在这个命名空间中,并且不会匹配

    <xsl:template match="/modsCollection">

您需要向xmlns:mods您的元素添加一个声明此命名空间xsl:stylesheet,并在模板匹配表达式和apply-templates选择表达式中使用前缀

    <xsl:template match="/mods:modsCollection">
于 2013-06-03T17:51:55.337 回答