XSL按部分分组

时间:2015-08-18 00:49:07

标签: xml xslt xslt-1.0

使用XSL 1.0,我试图获取两个“Section”元素之间的数据。我可以毫不费力地单独获取“标题”信息,但我也想知道它们之间的区域是什么,因为它们不是兄弟姐妹。这就是我搞砸的地方。

我在网络和这个论坛上搜索了各种解决方案,主要是尝试生成密钥并使用分组,但我没有成功获得任何有效的东西。有时它是“空白预期”错误或根本没有。

INPUT:

<Root>
  <Content>
    <Paragraph Type="New Section">
      <Text>Section A</Text>
    </Paragraph>
    <Paragraph Type="Stuff">
      <Text>Random information 1</Text>
    </Paragraph>
    <Paragraph Type="Heading">
      <Text>Important information 1</Text>
    </Paragraph>
    <Paragraph Type="Stuff">
      <Text>Random information 2</Text>
    </Paragraph>
    <Paragraph Type="Heading">
      <Text>Important information 2</Text>
    </Paragraph>
    <Paragraph Type="End Of Section">
      <Text>End of Section A</Text>
    </Paragraph>
    <Paragraph Type="New Section">
      <Text>Section B</Text>
    </Paragraph>
    <Paragraph Type="Stuff">
      <Text>Random information 3</Text>
    </Paragraph>
    <Paragraph Type="Heading">
      <Text>Important information 3</Text>
    </Paragraph>
    <Paragraph Type="Stuff">
      <Text>Random information 4</Text>
    </Paragraph>
    <Paragraph Type="Heading">
      <Text>Important information 4</Text>
    </Paragraph>
    <Paragraph Type="End Of Section">
      <Text>End of Section B</Text>
    </Paragraph>
  </Content>
</Root>

期望的输出:

"Important information 1"
"Section A"
"Important information 2"
"Section A"
"Important information 3"
"Section B"
"Important information 4"
"Section B"

正如我所提到的,使用选择和何时测试Paragraph / @ Type =“Heading”我能够获得“重要信息”文本,但我无法弄清楚如何判断它们落在哪个部分之间。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

我无法弄清楚如何判断它们落在哪个部分之间。

如果你将问题重述为&#34;哪一部分是当前标题&#34;之前开始的最后一部分,那么它变得相当简单:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/Root">
    <xsl:for-each select="Content/Paragraph[@Type='Heading']">
        <xsl:value-of select="Text"/>
        <xsl:text>&#10;</xsl:text>
        <xsl:value-of select="preceding-sibling::Paragraph[@Type='New Section'][1]/Text"/>
        <xsl:text>&#10;</xsl:text>      
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>