使用另一个文件中相同节点的值替换节点值
Replace node value using value from same node in another file
我有两个输入文件:file1.xml 和 file2.xml,结构相同但内容不同(source
和 target
节点)。
file1.xml(简化版)
<?xml version="1.0" encoding="UTF-8"?>
<xliff>
<file>
<body>
<trans-unit id="MDSD_0">
<source>Gestioni els seus favorits</source>
<target>Gestioni els seus favorits</target>
</trans-unit>
<trans-unit id="MDSD_1">
<source>Favorits</source>
<target>Favorits</target>
</trans-unit>
</body>
</file>
</xliff>
file2.xml(简化版)
<?xml version="1.0" encoding="UTF-8"?>
<xliff>
<file>
<body>
<trans-unit id="MDSD_0">
<source>Manage your bookmarks</source>
<target>Manage your bookmarks</target>
</trans-unit>
<trans-unit id="MDSD_1">
<source>Bookmarks</source>
<target>Bookmarks</target>
</trans-unit>
</body>
</file>
</xliff>
我想从 file1.xml 中获取除源节点之外的所有内容,我希望从 file2.xml 中获取。换句话说,我想用 file2.xml.
中的 source
替换 file1.xml 中的 source
我很想用 Perl 或 PHP 来做,但我认为在 XSLT 中会更有效率。但是,我有点卡住了。
我的样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="source">
<source>
<xsl:value-of select="document('file2.xlf')//source" />
</source>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这会产生以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<xliff>
<file>
<body>
<trans-unit id="MDSD_0">
<source>Manage your bookmarks</source>
<target>Gestioni els seus favorits</target>
</trans-unit>
<trans-unit id="MDSD_1">
<source>Manage your bookmarks</source> <!-- this one is wrong -->
<target>Favorits</target>
</trans-unit>
</body>
</file>
</xliff>
如您所见,它仅使用 file2.xml 中第一个源节点的内容来替换 file1.xml 中的所有源节点。
我想我需要根据位置或父 trans-unit
的 id
相同的位置以某种方式进行选择。我试过
<xsl:value-of select="document('file2.xlf')//source/parent::trans-unit[@id= current()]" />
但这给了我 <source/>
.
如果有任何提示,我将不胜感激。
我的样式表是 XSLT 版本 1,但我想如果需要我可以使用 XLST 2.0(我使用的是 Oxygen 和免费版本的 Saxon)。
假设您想通过匹配父 trans-unit
的 id
来查找 source
值,您可以这样做:
<xsl:value-of select="document('file2.xml')/xliff/file/body/trans-unit[@id=current()/../@id]/source" />
在 XSLT 2.0 中,您可以将 key 定义为:
<xsl:key name="src" match="source" use="../@id" />
然后将其用作:
<xsl:value-of select="key('src', ../@id, document('file2.xml'))" />
改变
<xsl:template match="source">
<source>
<xsl:value-of select="document('file2.xlf')//source" />
</source>
</xsl:template>
至
<xsl:template match="source">
<xsl:copy-of select="key('ref', ../@id, document('file2.xlf'))/source" />
</xsl:template>
将 <xsl:key name="ref" match="trans-unit" use="@id"/>
添加到样式表(并确保在 oXygen 中使用 Saxon 9 以获得 XSLT 2.0 支持)。
我有两个输入文件:file1.xml 和 file2.xml,结构相同但内容不同(source
和 target
节点)。
file1.xml(简化版)
<?xml version="1.0" encoding="UTF-8"?>
<xliff>
<file>
<body>
<trans-unit id="MDSD_0">
<source>Gestioni els seus favorits</source>
<target>Gestioni els seus favorits</target>
</trans-unit>
<trans-unit id="MDSD_1">
<source>Favorits</source>
<target>Favorits</target>
</trans-unit>
</body>
</file>
</xliff>
file2.xml(简化版)
<?xml version="1.0" encoding="UTF-8"?>
<xliff>
<file>
<body>
<trans-unit id="MDSD_0">
<source>Manage your bookmarks</source>
<target>Manage your bookmarks</target>
</trans-unit>
<trans-unit id="MDSD_1">
<source>Bookmarks</source>
<target>Bookmarks</target>
</trans-unit>
</body>
</file>
</xliff>
我想从 file1.xml 中获取除源节点之外的所有内容,我希望从 file2.xml 中获取。换句话说,我想用 file2.xml.
中的source
替换 file1.xml 中的 source
我很想用 Perl 或 PHP 来做,但我认为在 XSLT 中会更有效率。但是,我有点卡住了。
我的样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="source">
<source>
<xsl:value-of select="document('file2.xlf')//source" />
</source>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这会产生以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<xliff>
<file>
<body>
<trans-unit id="MDSD_0">
<source>Manage your bookmarks</source>
<target>Gestioni els seus favorits</target>
</trans-unit>
<trans-unit id="MDSD_1">
<source>Manage your bookmarks</source> <!-- this one is wrong -->
<target>Favorits</target>
</trans-unit>
</body>
</file>
</xliff>
如您所见,它仅使用 file2.xml 中第一个源节点的内容来替换 file1.xml 中的所有源节点。
我想我需要根据位置或父 trans-unit
的 id
相同的位置以某种方式进行选择。我试过
<xsl:value-of select="document('file2.xlf')//source/parent::trans-unit[@id= current()]" />
但这给了我 <source/>
.
如果有任何提示,我将不胜感激。
我的样式表是 XSLT 版本 1,但我想如果需要我可以使用 XLST 2.0(我使用的是 Oxygen 和免费版本的 Saxon)。
假设您想通过匹配父 trans-unit
的 id
来查找 source
值,您可以这样做:
<xsl:value-of select="document('file2.xml')/xliff/file/body/trans-unit[@id=current()/../@id]/source" />
在 XSLT 2.0 中,您可以将 key 定义为:
<xsl:key name="src" match="source" use="../@id" />
然后将其用作:
<xsl:value-of select="key('src', ../@id, document('file2.xml'))" />
改变
<xsl:template match="source">
<source>
<xsl:value-of select="document('file2.xlf')//source" />
</source>
</xsl:template>
至
<xsl:template match="source">
<xsl:copy-of select="key('ref', ../@id, document('file2.xlf'))/source" />
</xsl:template>
将 <xsl:key name="ref" match="trans-unit" use="@id"/>
添加到样式表(并确保在 oXygen 中使用 Saxon 9 以获得 XSLT 2.0 支持)。