我有一个xml文档和一个现有的xslt转换(这两个都是相对较大的预先存在的代码)。
在XML的不同地方,我有这样声明的可空字段:
<author i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
但是,我已经在xml元素中声明了这个名称空间,如下所示:
<message xmlns="http://www.mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
我有一个请求,任何nil节点的输出应该像下面这样:
<author xsi:nil="true" />
。i:nil应该变成xsi:nil,元素上声明的命名空间应该被删除。
理想情况下,我希望修改现有的转换,将其应用于需要此转换的XML中的任何节点,但是我在措辞搜索以获得有关如何完成此操作的任何结果方面遇到了一些困难。如果有人能帮忙,我将不胜感激。
(我不能使用任何xslt 2.0的聪明才智,以免影响答案)。
稍大的样本输入:
<message xmlns="http://www.mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<paper>
<name>A name</name>
<author i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
</paper>
<paper>
<name>Another name</name>
<author>
Peter
</author>
<details>
<publishDate i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
<location>London</location>
</details>
</paper>
</message>
期望输出:
<message xmlns="http://www.mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<paper>
<name>A name</name>
<author xsi:nil="true" />
</paper>
<paper>
<name>Another name</name>
<author>
Peter
</author>
<details>
<publishDate xsi:nil="true" />
<location>London</location>
</details>
</paper>
</message>
编写一个恒等变换和两个单独的模板来处理
- 以
- 属性
- 元素的属性以
i
为前缀。
i
为前缀的<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="attribute::i:*">
<xsl:attribute name="{concat('xsi:',local-name())}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="*[attribute::i:*]">
<xsl:element name="{local-name()}" namespace="http://www.mynamespace.com">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Nillability属性现在以xsi:
为前缀,Schema实例命名空间仅在根元素上声明。
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="http://www.mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<paper>
<name>A name</name>
<author xsi:nil="true"/>
</paper>
<paper>
<name>Another name</name>
<author>
Peter
</author>
<details>
<publishDate xsi:nil="true"/>
<location>London</location>
</details>
</paper>
</message>