尝试使用a语句开头的每个组来处理兄弟元素;但得到'尾随'组

时间:2014-04-09 19:28:36

标签: xml xslt-2.0

这是我的XML的简化示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <root> 
    <text>
    <inlineTag name="Story">
    <inlineTag name="_01_head">Headline </inlineTag>
    <inlineTag name="_03_deck">leadin content</inlineTag>
    <inlineTag name="_02_byline">Author One</inlineTag>
    <inlineTag name="_02_byline">Author Two </inlineTag>
    <inlineTag name="_04_body_1stpara">Lead in paragraph. lead in paragraph. lead in  paragraph.</inlineTag>
    <inlineTag name="_04_body">BodyCopyBodyCopy blah blah blah 
    <inlineTag name="_italic">Inline styles in body copy</inlineTag>.
BodyCopyBodyCopy blah blah blah. BodyCopyBodyCopyblahblah blah.
    </inlineTag>
    <inlineTag name="_01_head">Another Headline</inlineTag>
    <inlineTag name="_04_body">BodyCopyBodyCopyblahblah blahBodyCopyBodyCopyblahblah blahBodyCopyBodyCopyblahblah blah 
    <inlineTag name="_italic">Inline styles in body copy</inlineTag>]. 
 BodyCopyBodyCopyblahblah blahBodyCopyBodyCopyblahblah.
   </inlineTag>
   </inlineTag>
</text>
</root>

每个实例应该产生不同的结果doc;像这样:

    <headline>Headline </headline>
    <deck>leadin content</deck>
    <bylines>
     <byline>Author One</byline>
    <byline>Author Two </byline>
    </bylines>
    <p lede='true'>Lead in paragraph. lead in paragraph. lead in paragraph.</p>
    <p>BodyCopyBodyCopy blah blah blah 
    <em style="italic">Inline styles in body copy</em>.
     BodyCopyBodyCopy blah blah blah. BodyCopyBodyCopyblahblah blah.
    </p>

另一个结果:

    <headline>Another Headline </headline>
    <p>BodyCopyBodyCopy blah blah blah 
    <em style="italic">Inline styles in body copy</em>.
     BodyCopyBodyCopy blah blah blah. BodyCopyBodyCopyblahblah blah.
    </p>

在text / inlineTag [@ name ='Story']下存在多少个广告...

使用类似的东西时,我可以接近我想要的东西:

   <xsl: for-each-group select="." group-starting-with="inlineTag[@name='_01_head']
   <xsl:for-each select="current-group()">
     <xsl:result-document href = "A unique naming sequence based on H1 count">
       <xsl:apply-templates select="."/> <!-- handles creation of the desired tagging -->
     </xsl:result-document>

但是:

无论我如何应用分组,第一个结果文档包含自己和所有兄弟姐妹,第二个排除第一个和所有兄弟姐妹,第三个排除第一个和第二个,依此类推......或者我得到每个人元素在自己的结果文档中。在所有情况下,我都得到了关于元素命名的正确结果,以及截然不同的结果文档名称(所以,是的,至少我得到了这个...)。

此外,我不能将任何其他结构强加给源xml,例如包含元素:

   <Story>
     <seperate><inlineTag name="_01_head">...</seperate>
     <seperate><inlineTag name="_01_head">...</seperate>
  </Story>

所以,问题是:

鉴于上面的例子,我如何构造for-each-group-group-starting-with语句和后续处理,以便最终得到一个结果文档,其中包含来自inlineTag的内容[@name ='_ 01_head']只有NEXT inlineTag [@name ='_ 01_head'];没有“捕获”第二个inlineTag [@name ='_ 01_head']组的内容?

并且,感谢您阅读这一点,并提前感谢任何指导。

1 个答案:

答案 0 :(得分:0)

很难理解您的操作,因为代码段for-each-group select="."看起来很奇怪,而且您不会显示上下文。

根据您拥有的XML和您想要的描述,我认为以下内容应该有所帮助:

<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:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root/text/inlineTag[@name = 'Story']">
  <xsl:for-each-group select="*" group-starting-with="inlineTag[@name = '_01_head']">
    <xsl:result-document href="Story{position()}.xml">
      <root>
        <xsl:apply-templates select="current-group()"/>
      </root>
    </xsl:result-document>  
  </xsl:for-each-group>
</xsl:template>

<xsl:template match="inlineTag[@name = '_01_head']">
  <headline>
    <xsl:apply-templates/>
  </headline>
</xsl:template>

<xsl:template match="inlineTag[@name = '_03_deck']">
  <deck>
    <xsl:apply-templates/>
  </deck>
</xsl:template>

</xsl:stylesheet>

我认为它显示了分组的正确方法以及转换其他内联元素的方法,您需要为所有不同类型的元素添加更多模板,并且您可能需要嵌套的相邻{{{ 1}}需要分组。但是,让我们首先确定以上是否是正确的方向,当应用于您的示例时,它会输出两个文件bylineStory1.xml