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">&#x200B;</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">&#x200B;</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">&#x200B;</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">&#x200B;</c>
</xsl:template>

(b) 在@sec_type='norm-refs' 的任何秒后添加一个新节点。那是

<xsl:template match="sec[@sec_type='norm-refs']">
  <xsl:copy-of select="."/>
  <c type="newaddingnode">&#x200B;</c>
</xsl:template>

现在,您可能还没有告诉我们其他条件,例如如果两者都存在或其中之一出现两次会发生什么情况。这些条件可以通过改进匹配模式或添加更多规则来处理。