2017-06-19 84 views
0

我運行以下變換:命名空間防止變換

java -jar saxon9.jar -it:main -xsl:my.xsl dir="ca-ES" 

的「CA-ES」包含具有下列根元素XLIFF文件:

<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:cba="http://www.softcon.de/XML-schema/de.softcon.cba.itembuilder.xliff-supplement" 
     version="1.1" 
     xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 xliff-core-1.1.xsd"> 

變換從使用相同的文件輔助輸入文件夾並生成與輸入文件夾中找到的許多結構相同的文件。

如果我從根目錄(即xliff)中刪除第一個名稱空間(即xmlns="urn:oasis:names:tc:xliff:document:1.1"),那麼轉換就像一個魅力。但是,如果我保留它,那麼它不起作用。

不工作的部分是,在主輸入文件匹配source,並從二次輸入文件與source替換它)的模板:

<xsl:copy-of select="key('ref', ../@id, doc($secondary-input))/source" /> 

如果不工作,我的意思是,source從主要輸入文件位於輸出中,而不是來自輔助輸入的預期source節點。所以看起來命名空間正在阻礙匹配。

尋找我已經嘗試了樣式表的文檔元素添加xpath-default-namespace屬性的解決方案:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="urn:oasis:names:tc:xliff:document:1.1" 
    version="2.0"> 

但隨後從主輸入source節點保持在輸出(即,它不被替換與二次輸入的一個)。

我自己也嘗試加入這個前綴,然後用它在樣式表來匹配節點(例如match="xlf:source"),但後來沒有source節點在所有輸出:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlf="urn:oasis:names:tc:xliff:document:1.1" 
    version="2.0"> 

我會感謝一些提示。

我使用的是XSLT 2.0和saxonb9-1-0-8j。

UPDATE

添加一個主輸入文件樣品(命名爲ca-ES_blabla.xlf,從文件夾取CA-ES):

<?xml version="1.0" encoding="UTF-8"?> 
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cba="http://www.softcon.de/XML-schema/de.softcon.cba.itembuilder.xliff-supplement" version="1.1" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 xliff-core-1.1.xsd"> 
    <file datatype="html" original="project.properties" source-language="ca"> 
    <body> 
     <trans-unit id="MDSD_0" xml:space="default"> 
     <source>Gestiona les adreces d'interès</source> 
     <target>Gestiona les adreces d'interès</target> 
     <context-group name="era"> 
      <context context-type="x-property-id">bookmarkHeaderText</context> 
     </context-group> 
     </trans-unit> 
     <trans-unit id="7" xml:space="default"> 
     <source>&lt;b&gt;Sempre rebrà un avís quan arribi a un punt a partir del qual no pugui tornar enrere.&lt;/b&gt;&lt;br /&gt;</source> 
     <target>&lt;b&gt;Sempre rebrà un avís quan arribi a un punt a partir del qual no pugui tornar enrere.&lt;/b&gt;&lt;br /&gt;</target> 
     <prop-group name="item_description"> 
      <prop prop-type="x-inquiry-nr">4</prop> 
      <prop prop-type="x-type">question</prop> 
     </prop-group> 
     </trans-unit> 
    </body> 
    </file> 
<!-- the xliff document might contain several <file> nodes --> 
</xliff> 

一個次級輸入文件樣品(命名爲en-GB_blabla.xlf,取自文件夾en-GB):

<?xml version="1.0" encoding="UTF-8"?> 
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cba="http://www.softcon.de/XML-schema/de.softcon.cba.itembuilder.xliff-supplement" version="1.1" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 xliff-core-1.1.xsd"> 
    <file datatype="html" original="project.properties" source-language="en-GB"> 
    <body> 
     <trans-unit id="MDSD_0" xml:space="default"> 
     <source>Manage your bookmarks</source> 
     <target>Manage your bookmarks</target> 
     <context-group name="era"> 
      <context context-type="x-property-id">bookmarkHeaderText</context> 
     </context-group> 
     </trans-unit> 
     <trans-unit id="7" xml:space="default"> 
     <source>&lt;b&gt;You will always receive a warning before reaching a point where you cannot go back.&lt;/b&gt;&lt;br /&gt;</source> 
     <target>&lt;b&gt;You will always receive a warning before reaching a point where you cannot go back.&lt;/b&gt;&lt;br /&gt;</target> 
     <prop-group name="item_description"> 
      <prop prop-type="x-inquiry-nr">4</prop> 
      <prop prop-type="x-type">question</prop> 
     </prop-group> 
     </trans-unit> 
    </body> 
    </file> 
<!-- the xliff document might contain several <file> nodes --> 
</xliff> 

和樣式表:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="urn:oasis:names:tc:xliff:document:1‌​.1" 
    version="2.0"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <!-- run as: 
    $> java -jar saxon9.jar -it:main -xsl:this_stylesheet.xsl dir="xx-XX"  --> 

    <!-- this captures the folder parameter given in the call --> 
    <xsl:param name="dir" select="dir" /> 

    <!-- this template iterates through the files in the input folder --> 
    <xsl:template name="main"> 
     <xsl:variable name="input-files" select="concat($dir, '?select=*.xlf')" /> 
     <xsl:apply-templates select="collection($input-files)"/> 
    </xsl:template> 

    <!-- this template defines the name of the output folder and files --> 
    <xsl:template match="/"> 
     <xsl:variable name="output-name" select="replace(
      tokenize(document-uri(/), '/')[last()], 
      '(.+)\.xlf', 
      '$1_bilingual.xlf' 
      )"/> 
     <xsl:result-document href="{$dir}_output/{$output-name}"> 
      <xsl:apply-templates/> 
     </xsl:result-document> 
    </xsl:template> 

    <!-- this template fetches the source from the English files --> 
    <xsl:key name="ref" match="trans-unit" use="@id"/> 
    <xsl:template match="source"> 
     <xsl:variable name="input-uri" select="document-uri(/)" /> 
     <!-- <xsl:message><xsl:value-of select="$input-uri" /></xsl:message> --> 
     <xsl:variable name="secondary-input" select="replace($input-uri, $dir, 'en-GB')"/> 
     <xsl:copy-of select="key('ref', ../@id, doc($secondary-input))/source" /> 
    </xsl:template> 

    <!-- this part generates the output --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

做兩個輸入文件(主要拉在收集和二次與文檔被拉)使用完全相同的命名空間? –

+0

嗨馬丁:)是的,主要和次要輸入文件是相同的,除了'源'節點的內容。 – msoutopico

+0

您可能需要添加樣式表和兩個輸入示例,以便我們在您自己找不到問題時進行調試,我認爲它必須是兩個文件之間的命名空間差異。 –

回答

1

這似乎是一個命名空間的問題,當我從源拷貝過來的值"urn:oasis:names:tc:xliff:document:1.1"xpath-default-namespace="urn:oasis:names:tc:xliff:document:1.1"代碼工作的樣式表。

我不知道你在你的樣式代碼字符(氧氣問我粘貼代碼時啓用一些語言支持),但不知何故字符串

"urn:oasis:names:tc:xliff:document:1.1" 
"urn:oasis:names:tc:xliff:document:1‌​.1" 

不相等:

var s1 = "urn:oasis:names:tc:xliff:document:1.1"; 
 
var s2 = "urn:oasis:names:tc:xliff:document:1‌​.1"; 
 
document.writeln('<code>' + s1 + ' === ' + s2 + ' : ' + (s1 === s2) + '<\/code>');

這可能是在樣式表的命名空間包含一個或多個https://en.wikipedia.org/wiki/Zero-width_non-joiner之後的第一個數字1

+0

準確地說,我的xmlns字符串有一個零寬度非連接器(U + 200C)和一個零寬度空間(U + 200B)。說實話,我不知道它們來自哪裏,但你是對的,刪除樣式表工作的無關字符。謝謝,馬丁。 – msoutopico