2016-08-19 87 views
0

我有一個簡單的XSLT腳本:XSL-簡單的例子失敗

<?xml version='1.0'?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="/package"> 
    <xsl:copy-of select="*"/> 
</xsl:template> 
</xsl:stylesheet> 

,當應用到下面的例子

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<package 
    xmlns="http://www.idpf.org/2007/opf" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:dcterms="http://purl.org/dc/terms/" 
    version="3.0" 
    xml:lang="en" 
    unique-identifier="pub-identifier" 
> 
    <metadata> 
     <dc:identifier id="pub-identifier">_idm462750791920</dc:identifier> 
     <meta id="meta-identifier" property="dcterms:identifier">_idm462750791920</meta> 
    </metadata> 
</package> 

產生一個無意義的結果

<?xml version="1.0"?> 


_idm462750791920 
_idm462750791920 

注我不使用與dc命名空間相關的元素,事情就像人們期望的那樣工作。例如,如果我使用:

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<package 
    xmlns="http://www.idpf.org/2007/opf" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:dcterms="http://purl.org/dc/terms/" 
    version="3.0" 
    xml:lang="en" 
    unique-identifier="pub-identifier" 
> 
<metadata> 
    asdfasdfads 
</metadata> 
</package> 

因此它看起來似乎認識到「包裝」元素並按照我的預期行事。

我必須做什麼使這項工作?

+1

'/ package'不匹配任何內容,因爲package位於默認名稱空間中。快速搜索xslt默認命名空間,你會發現很多例子。此外,這種無意義的結果是由於xslt的內置模板。當我回到電腦時,我會添加一個指向的鏈接。 –

+0

這是什麼*是預期的結果? –

+0

@michail - 我希望能夠顯示包元素中的所有文本。 –

回答

0

請注意,我沒有使用與dc命名空間相關的元素,事情就像人們期望的那樣工作。

你在期待什麼?這將導致以下的輸出:

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

     asdfasdfads 

這是不是我會從<xsl:copy-of select="*"/>想到如果/package被正確選擇。

因此,它似乎認識到「包裝」元素,並按我的預期行事。

不,對不起,它不。你所看到的是XSLT's built-in template rules的結果。

/package元素位於默認名稱空間http://www.idpf.org/2007/opf中。你可以做的是將該命名空間uri綁定到一個前綴,並在你的XPath中使用它(在match中)。

注意:只要uri相同,您使用的前綴無關緊要。

實施例...

XSLT 1.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:opf="http://www.idpf.org/2007/opf"> 
    <xsl:template match="/opf:package"> 
    <xsl:copy-of select="*"/> 
    </xsl:template> 
</xsl:stylesheet> 

輸出的第一輸入例子:

<metadata xmlns="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"> 
    <dc:identifier id="pub-identifier">_idm462750791920</dc:identifier> 
    <meta id="meta-identifier" property="dcterms:identifier">_idm462750791920</meta> 
</metadata> 

您的第二輸入例的輸出:

<metadata xmlns="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"> 
    asdfasdfads 
</metadata> 

如果這與您期望輸出的內容不同,請用您期望/想要的確切輸出更新您的問題。