对于经验丰富的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>
答案 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>