XSLT拒绝仅更改source-strips标记

时间:2013-06-03 17:36:16

标签: xml xslt translation

鉴于此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标题列表。相反,我只回到剥离的文本节点。是什么赋予了?我在某处做过蠢事吗?

~Erik

2 个答案:

答案 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">