这是我的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']组的内容?
并且,感谢您阅读这一点,并提前感谢任何指导。
答案 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}}需要分组。但是,让我们首先确定以上是否是正确的方向,当应用于您的示例时,它会输出两个文件byline
和Story1.xml
。