2011-05-31 103 views
0

我遇到了使用xsl將xml轉換爲xml的問題。我發現問題來自哪裏,但仍不知如何解決。用XSLT轉換XML問題

<?xml version="1.0" encoding="UTF-8"?> 
<tells uri="" xmlns="http://dl.kr.org/dig/2003/02/lang"> 
    <impliesc> 
    <catom name="name1"/> 
    <catom name="name2"/> 
    </impliesc> 
    <impliesc> 
    <catom name="name3"/> 
    <catom name="name4"/> 
    </impliesc> 
</tells> 

我認爲問題來源於此行

<tells uri="" xmlns="http://dl.kr.org/dig/2003/02/lang"> 

如果我刪除了 「URI =」 「的xmlns =」 http://dl.kr.org/dig/2003/02/ lang「」並且只留下

"<tells>" 

一切正常。但是有沒有一種方法可以在不刪除的情況下進行轉換?

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/"> 

    <xsl:element name="tells"> 

     <xsl:for-each select="./tells/impliesc"> 

      <xsl:element name="impliesc"> 

       <xsl:for-each select="./tells/impliesc/catom"> 

        <xsl:element name="catom"> 

         <xsl:attribute name="name"> 
          <xsl:value-of select="./tells/impliesc/individual/@name"/> 
         </xsl:attribute> 

        </xsl:element> 

       </xsl:for-each> 

      </xsl:element> 

     </xsl:for-each> 

    </xsl:element> 

</xsl:template> 

</xsl:stylesheet> 
+0

你能展示一下你的變換嗎? – 2011-05-31 17:26:18

+0

您可以發佈您的XSLT表格來幫助我們發現問題。 – Kaltezar 2011-05-31 17:26:57

回答

2

你是對的:你的轉換不起作用的原因是你在tells元素上有一個名稱空間聲明。

爲了使這個問題消失,您需要讓XSLT知道命名空間,並告訴它它試圖轉換的tells元素屬於該命名空間。要做到這一點,最常見的方法是聲明在xsl:stylesheet元素的命名空間前綴,然後使用前綴中的XPath,如:

<xsl:stylesheet xmlns:n="http://dl.kr.org/dig/2003/02/lang" ... > 
    ... 
    <xsl:template match="/"> 
     <output> 
     <xsl:apply-templates select="//n:tells"/> 
     </output> 
    </xsl:template> 

    <xsl:template match="n:tells"> 
     ... 
    </xsl:template> 

<xsl:stylesheet> 

在樣式表的頂部xmlns:n屬性告訴XSLT處理器存在'http://dl.kr.org/dig/2003/02/lang'命名空間,並且前綴n:是它的縮寫。在selectmatch屬性中,n:前綴告訴XSLT處理器,當它查找名爲tells的元素時,它應該在http://dl.kr.org/dig/2003/02/lang名稱空間中查找具有該名稱的元素。

XML名稱空間是XML技術的重要組成部分,人們在學習XML時往往會忽略它們 - 它們很複雜,並且不太直觀,並且在您出現時可以忽略它們很長一段時間加快XML。但是,有一點你不能再承受名稱空間不存在的簡化假設,而你就在那一點上。

+0

謝謝,經過3個小時的搜索,我終於可以使它工作了! – Borzh 2014-10-08 12:37:28

0

在處理名稱空間時,您必須在變換中聲明它們;否則您將無法正確選擇文檔節點。

0

沒有看到您的XSLT代碼,我們無法修復它。儘管如此,xmlns="http://dl.kr.org/dig/2003/02/lang"意味着tells元素及其後代元素位於該名稱空間中,因此您的XSLT需要考慮這一點。使用XSLT 1.0時,樣式表需要將前綴綁定到名稱空間URI,並在XPath表達式和XSLT匹配模式中使用該前綴來限定元素名稱,例如

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:df="http://dl.kr.org/dig/2003/02/lang" 
    exclude-result-prefixes="df" 
    version="1.0"> 

    <-- examples --> 
    <xsl:template match="df:tells"> 
    <foo> 
    <xsl:apply-templates/> 
    </foo> 
    </xsl:template> 

    <xsl:template match="df:impliesc"> 
    <bar> 
     <xsl:apply-templates select="df:catom[1]"/> 
    </bar> 
    </xsl:template> 

</xsl:stylesheet>