2015-10-13 130 views
1

我正在從一些alto xml文件製作一個簡單的SVG文件。除了惱人的命名空間問題,我已經開始工作了。轉換爲SVG文件時出現XSL命名空間問題

爲源XML頭(我不應該改變)是

<alto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.loc.gov/standards/alto/ns-v2#" 
    xsi:schemaLocation="http://www.loc.gov/standards/alto/ns-v2# http://www.loc.gov/standards/alto/alto-v2.0.xsd" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    > 

和我的XSL頭(我會很高興來改變,如果我們可以解決這個問題)

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/2000/svg" 
    > 

這兩件事情合併所創建的錯誤撒克遜:

嚴重性:警告 描述:SXXP0005:源文件是在名稱空間http://www.loc.gov/standards/alto/ns-v2#,b UT都沒有命名空間 URL的模板規則匹配的元素:http://www.saxonica.com/html/documentation/javadoc/net/sf/saxon/trans/SaxonErrorCode.html#SXXP0005

如果我刪除從源頭上線xmlns="http://www.loc.gov/standards/alto/ns-v2#"我改造工程完美...但我不希望有修改和unmodify數百這些文件只是爲了讓這個腳本工作。所以我真的需要修改xsl。我已經嘗試將alto行添加到xsl表單中,但這只是給出了「已經有命名空間」錯誤。

回答

0

作警告消息表明,在源XML的所有元素都在http://www.loc.gov/standards/alto/ns-v2#命名空間,所以你需要在你的樣式表這個命名空間綁定到前綴

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/2000/svg" 
    xmlns:a="http://www.loc.gov/standards/alto/ns-v2#" 
    > 

,然後使用前綴在您的模板規則和XPath表達式中,例如而不是/alto/foo/bar你會使用/a:alto/a:foo/a:bar。在XSLT 1.0樣式表中,這是匹配命名空間中元素的唯一方法,但由於您聲稱使用的是Saxon,因此您可以將樣式表切換到XSLT 2.0,並使用xpath-default-namespace來避免必須在任何地方加上前綴:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/2000/svg" 
    xpath-default-namespace="http://www.loc.gov/standards/alto/ns-v2#" 
    > 

有了這個,像/alto這樣的路徑將匹配相關名稱空間中的元素。

+0

這已經完全解決了我的問題,非常感謝你! –

0

那麼你已經不是我們顯示您的任何模板和撒克遜警告是關於模板,但我想你想使用

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/2000/svg" 
    xpath-default-namespace="http://www.loc.gov/standards/alto/ns-v2#" 
    >