XSLT,如果底层节点为空并且具有指定的属性,则删除节点组

时间:2016-02-11 09:52:15

标签: xml xslt

如果底层节点具有空值并且属性为ArrayOfValue,则需要删除节点。我无法编写任何代码,只允许在那一刻进行XSLT转换。

所以,例如我有这个XML:

                <describedBy xmlns="http://example.ex">
                 <item>
                    <value xmlns:v1="http://example.ex" xsi:type="v1:ArrayOfValue" />
                    <characteristic>XXXX</characteristic>
                 </item>
                 <item>
                    <value xmlns:v1="http://example.ex" xsi:type="v1:ArrayOfValue" />
                    <characteristic>YYYY</characteristic>
                 </item>
                 <item>
                    <value>1234567890</value>
                    <characteristic>ZZZZ</characteristic>
                 </item>
                 <item>
                    <value>0987654321</value>
                    <characteristic>UUUU</characteristic>
                 </item>
              </describedBy>

转换后我想要:

            <describedBy xmlns="http://example.ex">
                 <item>
                    <value>1234567890</value>
                    <characteristic>ZZZZ</characteristic>
                 </item>
                 <item>
                    <value>0987654321</value>
                    <characteristic>UUUU</characteristic>
                 </item>
              </describedBy>

是否可以通过XSLT转换以及如何实现?

1 个答案:

答案 0 :(得分:1)

您应该先使用XSLT identity transform

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

它本身只会复制所有节点和属性。这意味着您只需要从要更改或删除的节点中编写模板。因此,在您的情况下,它将是一个这样的模板,以匹配Item类型为“{1}”的元素“v1:ArrayOfValue”

value

请注意名称空间前缀的使用,因为XML输入中的元素都是名称空间的一部分,需要在XSLT中声明。

试试这个XSLT

<xsl:template match="v1:item[v1:value/@xsi:type='v1:ArrayOfValue']" />

请注意,您的XML并不完全有效,因为它缺少<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:v1="http://example.ex" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <xsl:output method="xml" indent="yes" /> <xsl:template match="v1:item[v1:value/@xsi:type='v1:ArrayOfValue']" /> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 前缀的声明,所以我假设根元素看起来更像是这样:

xsi