命名空间阻止转换
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><b>Sempre rebrà un avís quan arribi a un punt a partir del qual no pugui tornar enrere.</b><br /></source>
<target><b>Sempre rebrà un avís quan arribi a un punt a partir del qual no pugui tornar enrere.</b><br /></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><b>You will always receive a warning before reaching a point where you cannot go back.</b><br /></source>
<target><b>You will always receive a warning before reaching a point where you cannot go back.</b><br /></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。
我是运行以下改造:
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><b>Sempre rebrà un avís quan arribi a un punt a partir del qual no pugui tornar enrere.</b><br /></source>
<target><b>Sempre rebrà un avís quan arribi a un punt a partir del qual no pugui tornar enrere.</b><br /></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><b>You will always receive a warning before reaching a point where you cannot go back.</b><br /></source>
<target><b>You will always receive a warning before reaching a point where you cannot go back.</b><br /></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。