使用xsltproc使用source xml转换一个xml

时间:2014-11-13 09:44:01

标签: xml xslt

对于经验丰富的xslt专家来说,这可能不是一件容易的事,但这里有: 我有2个xml文件strings.xml和strings-es.xml 我需要删除strings-es.xml中但不在strings.xml中的节点(键是name属性) e.g。

的strings.xml:

<Resources>
   <!-- Strings for Dialog yes button -->
<string name="yes">"Yes"</string>

<!-- Strings for Dialog no button -->
<string name="no">"No"</string>

</Resources>

的字符串-es.xml

<Resources>
   <!-- Strings for Dialog yes button -->
<string name="yes">"Si"</string>

<!-- Strings for Dialog no button -->
<string name="no">"Non"</string>

<!-- Strings not used -->
<string name="not-important">"blabla"</string>

</Resources>

期望的输出:

<Resources>
   <!-- Strings for Dialog yes button -->
<string name="yes">"Si"</string>

<!-- Strings for Dialog no button -->
<string name="no">"Non"</string>


</Resources>

1 个答案:

答案 0 :(得分:0)

假设&#34; strings-es.xml&#34;是输入XML,&#34; strings.xml&#34;是一份外部文件:

输入XML

<Resources>
   <!-- Strings for Dialog yes button -->
<string name="yes">"Si"</string>

<!-- Strings for Dialog no button -->
<string name="no">"Non"</string>

<!-- Strings not used -->
<string name="not-important">"blabla"</string>

</Resources>

由于您说评论不重要,因此有一个单独的模板可以阻止它们被发送到输出。

<强>样式表

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:variable name="doc" select="doc('strings.xml')"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="string">
        <xsl:if test="$doc/Resources/string[@name = current()/@name]">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>

    <xsl:template match="Resources/comment()"/>

</xsl:transform>

XML输出

<Resources>
  <string name="yes">"Si"</string>
  <string name="no">"Non"</string>
</Resources>