XSLT不匹配元素 - 名称空间声明

时间:2013-03-06 19:37:45

标签: xslt metadata xslt-2.0

我确信这是一个非常简单的修复,但我很难过。我有输入XML,带有以下根元素,并重复子元素:

<modsCollection 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.loc.gov/mods/v3"
    xsi:schemaLocation="
      http://www.loc.gov/mods/v3
      http://www.loc.gov/standards/mods/v3/mods-3-4.xsd">
  <mods version="3.4">
            ...

我有一个带有以下内容的XSLT表,以匹配每个<mods>节点,并将其作为由<identifier type="local">元素命名的单独文件踢出。

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.loc.gov/mods/v3">
  <xsl:output method="xml" indent="yes"/>   

  <xsl:template match="/modsCollection">
    <xsl:for-each select="mods">
      <xsl:variable name="filename" 
          select="concat(normalize-space(
                           identifier[@type='local']),
                         '.xml')" />
      <xsl:result-document href="{$filename}">            
        <xsl:copy-of select="."></xsl:copy-of>     
      </xsl:result-document>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

如果XML输入在根元素中没有xmlns:xsi,xmlns或xsi:schemaLoaction属性,则此可以。因此,例如,它适用于以下内容:

<modsCollection>   
  <mods version="3.4">
            ...

我知道我们的一些MODS文件已经包含了前缀但我不清楚为什么如果我们的XSLT匹配没有查找前缀,这将无法使用前缀。任何想法或建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

<xsl:template match="/modsCollection">

在没有命名空间的情况下匹配modsCollection。你想要

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.loc.gov/mods/v3"
    xmlns:m="http://www.loc.gov/mods/v3">

然后

<xsl:template match="/m:modsCollection">

在mods命名空间中匹配modsCollection,同样在样式表中的所有xslt模式和xpath表达式中使用m:前缀。