需要更改主题对齐方式

时间:2017-02-27 10:30:26

标签: xml xslt xslt-2.0

我想通过使用XSL来订购Topic元素。我有很多细分,我把所有细分作为单独的主题。现在我想得到不同的输入,所以我想改变如下

我的输入XML是:

<Segments>
<Segment>
<Name>Food poisoning?</Name>
<Body>
<p>Food</p>
</Body>
</Segment>
<Segment>
<Name>Causes food poisoning?</Name>
<Body>
<p>Most</p>
<h3>Salmonella</h3>
<p>most</p>
</Body>
</Segment>
</Segments>

XSL我用作:

<xsl:template match="Segments">
<xsl:for-each-group select="*" group-starting-with="Segments">
<topic outputclass="">
<xsl:attribute name="id">topic_Head_<xsl:number count="Segments | Segment"/></xsl:attribute>
<title/>

<xsl:for-each-group select="current-group()" group-starting-with="Segment">
<xsl:choose>
<xsl:when test="self::Segment">
<topic>
<xsl:attribute name="id">topic_<xsl:number count="Segment"/></xsl:attribute>
<xsl:apply-templates select="node()"/>
</topic>
</xsl:when>
<xsl:otherwise>
<body><xsl:apply-templates select="current-group()"/></body>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</topic>
</xsl:for-each-group>
</xsl:template>

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

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

<xsl:template match="h3">
</xsl:template>         

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

输出我得到:

<topic outputclass="" id="topic_Head_1">
<title/>
<topic id="topic_1">
<title>Food poisoning?</title>
<body>
<p>Food</p>
</body>
</topic>
<topic id="topic_2">
<title>Causes food poisoning?</title>
<body>
<p>Most</p>

<p>most</p>
</body>
</topic>
</topic>

预期输出如下:

<topic outputclass="" id="topic_Head_1">
<title/>
<topic id="topic_1">
<title>Food poisoning?</title>
<body>
<p>Food</p>
</body>
</topic>
<topic id="topic_2">
<title>Causes food poisoning?</title>
<body>
<p>Most</p>
</body>
<topic id="topic_3">
<title>Salmonella</title>
<body>
<p>most</p>
</body>
</topic>
</topic>
</topic>

我需要h3标签必须像段内的另一个子主题一样。请提供您的建议。提前致谢

1 个答案:

答案 0 :(得分:1)

我的想法是: 对于Body元素,无论是否出现h3,都会产生2条不同的路径。 没有h3路径是微不足道的。 对于h3路径:

  • 首先处理第一个h3之前的所有元素
  • 将所有其他元素分组,从h3开始,为eatch组创建主题标签并应用模板

这是代码

<xsl:template match="Body">
<xsl:choose>
    <xsl:when test="h3">
      <body>
       <xsl:apply-templates select="h3[1]/preceding-sibling::*"/> 
      </body>                       
      <xsl:for-each-group select="h3[1] | h3[1]/following-sibling::*" group-starting-with="h3">
        <topic>
          <xsl:attribute name="id">topic_<xsl:number count="Segment | h3" level="any"/></xsl:attribute>
          <title><xsl:value-of select="." /></title>
          <xsl:apply-templates select="current-group()"/>
        </topic>
      </xsl:for-each-group>      
    </xsl:when>
    <xsl:otherwise>
      <body>
        <xsl:apply-templates select="node()"/>
      </body>
    </xsl:otherwise>
</xsl:choose>
</xsl:template>