我是XSLT的新手。我有一个xml到xml的转换任务。我要做的是通过检查原始xml文件中的一些属性值,将一些xml节点放到结果xml树中。
示例:
原始xml有
<doc>
<sec id="sec_1" sec-type="scope"> </sec>
<sec id="sec_1" sec-type="norm-refs"> </sec>
//more codes
<doc>
我需要做的是,放一些新的xml节点(例如:
<c type="newaddingnode">​</c>
)在节点的末尾,通过检查节点
例如:
如果存在sec-type="norm-refs"
,请在sec-type="scope"
的末尾插入新节点。如果此属性不存在,请在sec-type =“scope”的末尾插入新节点。如果两个部分都缺失,则什么也不做。
所以,如果我原来的xml如下,
<doc>
<sec id="sec_1" sec-type="scope"> </sec>
//more codes
<doc>
我的结果xml应该是这样的
<doc>
<sec id="sec_1" sec-type="scope"> </sec>
<c type="newaddingnode">​</c>
//more codes
<doc>
如果我的原始xml如下,
<doc>
<sec id="sec_1" sec-type="norm-refs"> </sec>
//more codes
<doc>
我的结果xml应该是这样的
<doc>
<sec id="sec_1" sec-type="norm-refs"> </sec>
<c type="newaddingnode">​</c>
//more codes
<doc>
如果<sec id="sec_1" sec-type="norm-refs">
和<sec id="sec_1" sec-type="scope">
都不存在,则不应添加新节点。添加节点也不应该是<sec>
的子节点。但它应该添加<sec>
节点的结尾。
在其他语言中这将是相对容易的任务,但我是xslt的新手,所以我想知道如何在XSLT中执行此操作。我可以使用<xsl:if>
或<xsl:choose>
来执行此操作吗?
答案 0 :(得分:1)
嗯,我认为我们仍然没有完整的规格,但我会尝试。我想你已告诉我们(a)在@ sec_type ='scope'的任何秒之后添加一个新节点。这是
<xsl:template match="sec[@sec_type='scope']">
<xsl:copy-of select="."/>
<c type="newaddingnode">​</c>
</xsl:template>
(b)在@ sec_type ='norm-refs'之后的任何秒之后添加一个新节点。这是
<xsl:template match="sec[@sec_type='norm-refs']">
<xsl:copy-of select="."/>
<c type="newaddingnode">​</c>
</xsl:template>
现在,还有其他条件可能你没有告诉我们,比如如果两者都存在或者其中一个存在两次会发生什么。可以通过改进匹配模式或添加更多规则来处理这些条件。