使用另一个文件

时间:2017-06-18 10:45:09

标签: xml xslt merge xliff oxygenxml

我有两个输入文件:file1.xml和file2.xml,结构相同但内容不同(sourcetarget个节点。)

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获取。换句话说,我想将file1.xml中的source替换为file2.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中的所有源节点。

我想我需要根据位置或父id的{​​{1}}相同的方式进行选择。我试过

trans-unit

但这给了我<xsl:value-of select="document('file2.xlf')//source/parent::trans-unit[@id= current()]" />

我会感谢任何提示。

我的样式表是XSLT版本1,但我想如果有必要我可以使用XLST 2.0(我使用的是氧气和免费版本的Saxon)。

2 个答案:

答案 0 :(得分:1)

假设您想通过匹配父source的{​​{1}}来查找id值,您可以这样做:

trans-unit

在XSLT 2.0中,您可以通过将定义为:

来简化(并提高效率)
<xsl:value-of select="document('file2.xml')/xliff/file/body/trans-unit[@id=current()/../@id]/source" />

然后将其用作:

<xsl:key name="src" match="source" use="../@id" />

答案 1 :(得分:1)

更改

 public static long fibonacciIterative(long n) 
    {
      if(n <= 1) {
    return n;
           }
        int x = 1;
        int y = 1;
        for(int i=2; i<n; i++) 
           {
            int z = x;
            x+= y;
            y = z;
            }
        return x;
}

<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> 添加到样式表中(并确保在oXygen中使用Saxon 9来支持XSLT 2.0)。