Xslt 基于前面的同级处理指令对元素进行分组

Xslt 基于前面的同级处理指令对元素进行分组,xslt,xslt-1.0,Xslt,Xslt 1.0,我试图使用一个键来根据元素是否具有作为前一个兄弟的特定处理指令来对元素进行分组,但我没有运气 对于下面的示例输入,我希望每个具有前一个同级处理指令(包含“key”)的与其满足相同条件的同级元素分组。输入示例: <root> <p>not in key</p> <?samplePI key?> <p>start of key; </p> <?samplePI key?> &l

我试图使用一个键来根据元素是否具有作为前一个兄弟的特定处理指令来对
元素进行分组,但我没有运气

对于下面的示例输入,我希望每个具有前一个同级处理指令(包含“key”)的
与其满足相同条件的同级
元素分组。输入示例:

<root>
    <p>not in key</p>
    <?samplePI key?>
    <p>start of key; </p>
    <?samplePI key?>
    <p>in key 1; </p>
    <?samplePI key?>
    <p>in key 2; </p>
    <p>Not in key</p>
    <?samplePI key?>
    <p>start of new key; </p>
    <?samplePI key?>
    <p>in new key 3;</p>
</root>

不在关键位置

按键启动

在键1中

在键2中

不在关键位置

新密钥的启动

在新的关键3

示例输出:

<root>
    <p>not in key</p>
    <p>start of key; in key 1; in key 2;</p>
    <p>Not in key</p>
    <p>start of new key; in new key 3;</p>
</root>

不在关键位置

按键启动;在键1中;在键2中

不在关键位置

新密钥的启动;在新的关键3

我得到的一个例子:

<xsl:template match="root">
        <root>
            <xsl:apply-templates/>
        </root>
    </xsl:template>

    <xsl:template match="p">
        <xsl:choose>
            <xsl:when test="preceding-sibling::node()[1][self::processing-instruction()[contains(., 'key')]][preceding-sibling::p[1][(preceding-sibling::node()[1][self::processing-instruction()[contains(., 'key')]])]]">

            </xsl:when>
            <xsl:when test="preceding-sibling::node()[1][self::processing-instruction()[contains(., 'key')]][preceding-sibling::p[1][not(preceding-sibling::node()[1][self::processing-instruction()[contains(., 'key')]])]]">
                <p><xsl:value-of select="text()"/>
                    <xsl:apply-templates select="key('nodes', generate-id())" mode="groupedParas"/>
                </p>

            </xsl:when>
            <xsl:otherwise>
                <p><xsl:apply-templates/></p>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="p" mode="groupedParas">
        <xsl:apply-templates/>
    </xsl:template>


    <xsl:key name="nodes" match="node()[(self::p[preceding-sibling::node()[1][self::processing-instruction()[contains(., 'key')]]])]" use="generate-id((preceding-sibling::p)[last()])"/>

    <xsl:template match="text()">
        <xsl:value-of select="."/>
    </xsl:template>   



请注意,我需要帮助获得正确的键语法,而不是生成所需的结构。为此,我需要使用XSLT1.0。非常感谢您的帮助。

使用XSLT 2.0,它看起来易于管理

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
                version="2.0">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:template match="root">
  <xsl:copy>
    <xsl:for-each-group select="*" group-adjacent="boolean(preceding-sibling::node()[1][self::processing-instruction()[contains(., 'key')]])">
      <xsl:choose>
        <xsl:when test="current-grouping-key()">
          <p>
            <xsl:apply-templates select="current-group()/node()"/>
          </p>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select="current-group()"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

使用XSLT2.0,它看起来是可管理的

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
                version="2.0">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:template match="root">
  <xsl:copy>
    <xsl:for-each-group select="*" group-adjacent="boolean(preceding-sibling::node()[1][self::processing-instruction()[contains(., 'key')]])">
      <xsl:choose>
        <xsl:when test="current-grouping-key()">
          <p>
            <xsl:apply-templates select="current-group()/node()"/>
          </p>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select="current-group()"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

使用XSLT2.0,它看起来是可管理的

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
                version="2.0">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:template match="root">
  <xsl:copy>
    <xsl:for-each-group select="*" group-adjacent="boolean(preceding-sibling::node()[1][self::processing-instruction()[contains(., 'key')]])">
      <xsl:choose>
        <xsl:when test="current-grouping-key()">
          <p>
            <xsl:apply-templates select="current-group()/node()"/>
          </p>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select="current-group()"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

使用XSLT2.0,它看起来是可管理的

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
                version="2.0">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:template match="root">
  <xsl:copy>
    <xsl:for-each-group select="*" group-adjacent="boolean(preceding-sibling::node()[1][self::processing-instruction()[contains(., 'key')]])">
      <xsl:choose>
        <xsl:when test="current-grouping-key()">
          <p>
            <xsl:apply-templates select="current-group()/node()"/>
          </p>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select="current-group()"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

你试过什么吗?这不是编码服务。。。首先尝试很多,研究一下,如果你仍然失败,询问并展示一些你已经尝试过的代码。@PhistucK-是的,我已经做了一段时间了。我完全知道这不是一个编码服务,但我被卡住了。我将添加一些代码后,我调整它,以符合我的简化样本。1。我们可以假设给定集合中的第一个节点不是处理指令吗?如示例所示?2.输出的顺序重要吗?你试过什么吗?这不是编码服务。。。首先尝试很多,研究一下,如果你仍然失败,询问并展示一些你已经尝试过的代码。@PhistucK-是的,我已经做了一段时间了。我完全知道这不是一个编码服务,但我被卡住了。我将添加一些代码后,我调整它,以符合我的简化样本。1。我们可以假设给定集合中的第一个节点不是处理指令吗?如示例所示?2.输出的顺序重要吗?你试过什么吗?这不是编码服务。。。首先尝试很多,研究一下,如果你仍然失败,询问并展示一些你已经尝试过的代码。@PhistucK-是的,我已经做了一段时间了。我完全知道这不是一个编码服务,但我被卡住了。我将添加一些代码后,我调整它,以符合我的简化样本。1。我们可以假设给定集合中的第一个节点不是处理指令吗?如示例所示?2.输出的顺序重要吗?你试过什么吗?这不是编码服务。。。首先尝试很多,研究一下,如果你仍然失败,询问并展示一些你已经尝试过的代码。@PhistucK-是的,我已经做了一段时间了。我完全知道这不是一个编码服务,但我被卡住了。我将添加一些代码后,我调整它,以符合我的简化样本。1。我们可以假设给定集合中的第一个节点不是处理指令吗?如示例所示?2.输出的顺序重要吗?谢谢-很好的答案。最重要的是,我学到了一些东西:)我想使用一个键,因为我的输入XML实际上比我在示例中使用的要复杂得多(OOXML),而且我认为它会更有效。谢谢-回答得很好。最重要的是,我学到了一些东西:)我想使用一个键,因为我的输入XML实际上比我在示例中使用的要复杂得多(OOXML),而且我认为它会更有效。谢谢-回答得很好。最重要的是,我学到了一些东西:)我想使用一个键,因为我的输入XML实际上比我在示例中使用的要复杂得多(OOXML),而且我认为它会更有效。谢谢-回答得很好。最重要的是,我学到了一些东西:)我想使用一个键,因为我的输入XML实际上比我在示例中使用的要复杂得多(OOXML),而且我认为它会更有效。