2013-03-06 146 views
1

我相信這是一個非常簡單的修復,但我很難過。我有輸入XML具有下列根元素,並且重複的子元素:XSLT與元素 - 名稱空間聲明不匹配

<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"> 
      ... 

我有與下列各<mods>節點匹配XSLT片和踢它作爲由名爲一個單獨的文件一個<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匹配,這將不無前綴工作不尋找前綴。任何想法或建議將不勝感激。

回答

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

以匹配器官功能障礙綜合徵的命名空間modsCollection,同樣使用m:前綴在樣式表的所有XSLT模式和XPath表達式。

+0

真的那麼簡單不是它,非常感謝。奇蹟般有效。 – ghukill 2013-03-07 01:03:32

+1

幾乎所有StackOverflow搜索中都可以找到答案,其中關鍵詞「XSLT」和「名稱空間」出現。 – 2013-03-07 11:07:33