如果底层节点具有空值并且属性为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转换以及如何实现?
答案 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