XSLT document() 函数用于比较和组合两个 XML 文件

问题描述 投票:0回答:1

我正在使用 Notepad++ 和 XSLT 1.0 来转换 XML 文件。 有一个 Data.xml 文件和一个 Dict.xml 文件,后者保存字符串的翻译。我希望在输出中翻译 Data.xml 中的字符串。

数据.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
    <Textabschnitt>
        <Root ID="2050775654055586328">Administration</Root>
    </Textabschnitt>
    <Textabschnitt ID="13667714361645396460">All</Textabschnitt>
    <Textabschnitt ID="4765748458590838957">Application</Textabschnitt>
    <Textabschnitt>
        <Tabelle>
            <Zelle>
                <Textabschnitt ID="14682159838120944212">Name</Textabschnitt>
            </Zelle>
            <Zelle>
                <Textabschnitt ID="2960145709916589219">Status</Textabschnitt>
            </Zelle>
        </Tabelle>
    </Textabschnitt>
</Root>

Dict.xml:

<?xml version="1.0" encoding="utf-8"?>
<DICT>
    <DICT_ENTRY LANG_ID="ro">
        <uicontrol id="2050775654055586328">Administrare</uicontrol>
    </DICT_ENTRY>
    <DICT_ENTRY LANG_ID="ro-RO">
        <uicontrol id="13667714361645396460">Toate</uicontrol>
    </DICT_ENTRY>
    <DICT_ENTRY LANG_ID="ro-RO">
        <uicontrol id="4765748458590838957">Aplicație</uicontrol>
    </DICT_ENTRY>
    <DICT_ENTRY LANG_ID="ro-RO">
        <uicontrol id="14682159838120944212">Nume</uicontrol>
    </DICT_ENTRY>
    <DICT_ENTRY LANG_ID="ro-RO">
        <uicontrol id="2960145709916589219">Stare</uicontrol>
    </DICT_ENTRY>
</DICT>

输出应与 Data.xml 相同,但 Textabschnitt 元素的内容替换为 @id 属性标识的翻译。

我在网上和 O'Reilly 中查看了很多 document() 用法的示例。但是,我无法让它读取文件并输出它。

我一直在尝试的 XSLT(以及许多其他尝试)是:

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

     <xsl:param name="translatedStrings" select="document('Localization_ro.xml')"/>


<!--Identity template, provides default behavior that copies all content into the output -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

<!-- replace string with translated string, identified with ID (first attempt) -->
    <xsl:template match="//@ID">
        <xsl:variable name="id" select="." />
        <xsl:attribute name="id">
            <xsl:value-of select="$id"/>
        </xsl:attribute>
        <xsl:value-of select="$translatedStrings/DICT/DICT_ENTRY/uicontrol[@id=$id][1]"/>
    </xsl:template>

</xsl:stylesheet>

这个特定的输出会生成一个空白文件,我认为这是最后一个

xsl:value-of
语句有问题。

我确信我正在做一些非常基本且错误的事情,但不确定是什么。任何有关正确方法和语法的指示都将非常感激。谢谢你。

编辑:为了清楚起见,我想要的输出是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
    <Textabschnitt>
        <Root ID="2050775654055586328">Administrare</Root>
    </Textabschnitt>
    <Textabschnitt ID="13667714361645396460">Toate</Textabschnitt>
    <Textabschnitt ID="4765748458590838957">Aplicație</Textabschnitt>
    <Textabschnitt>
        <Tabelle>
            <Zelle>
                <Textabschnitt ID="14682159838120944212">Nume</Textabschnitt>
            </Zelle>
            <Zelle>
                <Textabschnitt ID="2960145709916589219">Stare</Textabschnitt>
            </Zelle>
        </Tabelle>
    </Textabschnitt>
</Root>
xpath xslt document
1个回答
1
投票

我认为你想做类似的事情:

<xsl:template match="Textabschnitt[@ID]">
    <xsl:variable name="id" select="@ID" />
    <Textabschnitt ID="{$id}">
            <xsl:value-of select="$translatedStrings/DICT/DICT_ENTRY/uicontrol[@id=$id]"/>
    </Textabschnitt>
</xsl:template>

顺便说一句,如果您使用的是 XSLT 1.0,您的样式表不应声明

version="2.0"

© www.soinside.com 2019 - 2024. All rights reserved.