XSLT - 通过检查属性来放置内容

时间:2015-06-18 09:19:06

标签: xml xslt xslt-2.0

我是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>来执行此操作吗?

1 个答案:

答案 0 :(得分:1)

嗯,我认为我们仍然没有完整的规格,但我会尝试。我想你已告诉我们(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>

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