命名空间阻止转换

Namespaces preventing transformation

我是运行以下改造:

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。

更新

添加一个主要输入文件示例(名为 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', 
            '_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>

这似乎是一个命名空间问题,当我将值 "urn:oasis:names:tc:xliff:document:1.1" 从源代码复制到样式表时,代码工作正常 xpath-default-namespace="urn:oasis:names:tc:xliff:document:1.1"

我不确定您的样式表代码中有哪些字符(oXygen 要求我在粘贴您的代码时启用某些语言支持)但不知何故字符串

"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>');

您的样式表中的命名空间可能在第一个数字 1 后包含一个或多个 https://en.wikipedia.org/wiki/Zero-width_non-joiner