xslt:在以下节点之间进行选择

时间:2015-02-23 18:17:26

标签: xml xslt

<division>
    <subdiv id="1" type="author">
        <emptype value="1"/>
        <p>name of author</p>
        <p>date</p>
    </subdiv>
    <subdiv id="2" type="acknowledgement">
        <emptype value="2"/>
        <h>acknowledgement</h>
        <p>some texts</p>
        <emptype value="3"/>
        <p>more text</p>
    </subdiv>
    <subdiv id="3" type="chapters">
        <emptype value="4"/>
        <emptype value="5"/>
        <emptype value="6"/>
        <h>chapter 1</h>
        <p>paragraph 1</p>
        <p>paragraph 2</p>
        <p>paragraph 3</p>
        <emptype value="7"/>
        <p>paragraph 4</p>
        <emptype value="8"/>
        <h>chapter 2</h>
        <p>paragraph 1</p>
     </subdiv>
</division>

我将此XSLT拆分为每个<subdiv>节点的单独文件。如果任何<subdiv>节点包含在第一个<emptype>节点之前发生的<h>节点,则应将该<emptype>节点移动到先前的<subdiv>节点。< / p>

e.g。

文件1

<division>
    <subdiv id="1" type="author">
        <emptype value="1"/>
        <p>name of author</p>
        <p>date</p>
        <emptype value="2"/>
    </subdiv>
</division>

file2的

<division>
    <subdiv id="2" type="acknowledgement">
        <h>acknowledgement</h>
        <p>some texts</p>
        <emptype value="3"/>
        <p>more text</p>
        <emptype value="4"/>
        <emptype value="5"/>
        <emptype value="6"/>
     </subdiv>
</division>

file3的

<division>
    <subdiv id="3" type="chapters">
        <h>chapter 1</h>
        <p>paragraph 1</p>
        <p>paragraph 2</p>
        <p>paragraph 3</p>
        <emptype value="7"/>
        <p>paragraph 4</p>
        <emptype value="8"/>
        <h>chapter 2</h>
        <p>paragraph 1</p>
     </subdiv>
</division>

我能够将XML拆分为单独的文件,但无法将<emptype>节点移动到正确的位置。我将不胜感激任何帮助。

注意 :我只查找XPath表达式,以选择<emptype>内但{1}之前的<subdiv>个节点发生<h>

2 个答案:

答案 0 :(得分:0)

如果您要查找的是XPath表达式,则以下内容应该有效:

<xsl:copy-of select="subdiv/emptype[count(preceding-sibling::h) = 0 and count(../h) &gt; 0]" />

仅当<emptype>节点没有任何名为<h>的兄弟姐妹,并且至少有一个名为<h>的兄弟节点时,才会复制<emptype value="1">节点。 (第二个条件允许复制{{1}},这似乎是您想要的。)

答案 1 :(得分:0)

您是否希望从下一个细分中获取空白?

假设subdiv是您当前的上下文节点:

following-sibling::subdiv[1]/emptype[not(preceding-sibling::h)]

这没有考虑如何处理最终的细分。我会使用xsl:if对last()进行测试,而不是试图让XPath变得混乱。