XML文档按trans-unit节点是否包含target子节点拆分的恒等变换实现需求
XML文档按trans-unit节点是否包含target子节点拆分的恒等变换实现需求
嗨,看起来你需要把这份XML文档拆分成两个结果:一个只保留包含<target>子节点的<trans-unit>,另一个只保留没有<target>的。用XSLT就能轻松实现这个需求,而且是恒等变换——也就是保留原节点的所有属性和内容,只是过滤掉不符合条件的节点。
实现思路
核心是基于XSLT的恒等变换模板(默认复制所有节点、属性和文本),然后添加针对<trans-unit>节点的匹配规则,只保留符合条件的节点,其他的则跳过输出。
输出1:只保留包含<target>子节点的<trans-unit>
下面的XSLT会复制整个XML结构,但只保留带有<target>子节点的<trans-unit>:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 恒等变换模板:复制所有节点、属性和文本 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配trans-unit节点,仅当它包含target子节点时才处理 --> <xsl:template match="trans-unit[not(target)]"/> </xsl:stylesheet>
解释:第二个模板会匹配没有<target>子节点的<trans-unit>,并且模板内容为空,意味着这些节点会被跳过,不输出到结果中。
输出2:只保留不包含<target>子节点的<trans-unit>
对应的,把匹配规则反过来即可:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 恒等变换模板 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配trans-unit节点,仅当它包含target子节点时跳过 --> <xsl:template match="trans-unit[target]"/> </xsl:stylesheet>
解释:这个模板会匹配有<target>子节点的<trans-unit>,并跳过它们,最终结果只保留没有<target>的<trans-unit>。
备注:内容来源于stack exchange,提问作者RM_EM2LQyOngoArEZj
相关产品推荐
相关产品推荐

