XSLT - 通过检查属性放置内容
XSLT - Put Content by checking attribute
我是 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>
) 在节点末尾通过检查节点
中的属性得到结果 xml
例如:
如果 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>
来执行此操作吗?
好吧,我认为我们还没有完整的规范,但我会尝试的。我想您已经告诉我们 (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>
现在,您可能还没有告诉我们其他条件,例如如果两者都存在或其中之一出现两次会发生什么情况。这些条件可以通过改进匹配模式或添加更多规则来处理。
我是 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>
来执行此操作吗?
好吧,我认为我们还没有完整的规范,但我会尝试的。我想您已经告诉我们 (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>
现在,您可能还没有告诉我们其他条件,例如如果两者都存在或其中之一出现两次会发生什么情况。这些条件可以通过改进匹配模式或添加更多规则来处理。