2017-08-09 112 views
0

我需要创建的根元素,其中是不是在输入如何创建我的输入xml的根元素?

XML我作为可用的模板:

<Body> 
<p outputclass="Body_Text">AAAA.</p> 

<p outputclass="Normal"><b>Q:</b> Why?</p> 
<p outputclass="Body_Text_Question"><b>Q:</b> What?</p> 
<p outputclass="Body_Text_Answer"><b>A:</b> In.</p> 
<p outputclass="Body_Text_Answer">The</p> 

<p outputclass="Normal"><b>Q:</b> Why?</p> 
<p outputclass="Body_Text_Question"><b>Q:</b> What?</p> 
<p outputclass="Body_Text_Answer"><b>A:</b> In.</p> 
<p outputclass="Body_Text_Answer">The</p> 
</Body> 

XSL我使用:

<xsl:template match="p[@outputclass='Body_Text']"> 
    <para> 
     <xsl:apply-templates/> 
    </para> 
    </xsl:template> 

    <xsl:template match="p[@outputclass='Normal']"> 
    <item num="{replace(node()[1], '^\s+', '')}"> 
     <para><xsl:apply-templates select="node()[position() gt 1]"/></para> 
    </item> 
    </xsl:template> 

    <xsl:template match="p[@outputclass='Body_Text_Question'][b]"> 
    <item num="{replace(node()[1], '^\s+', '')}"> 
     <para><xsl:apply-templates select="node()[position() gt 1]"/></para> 
    </item> 
    </xsl:template> 

    <xsl:template match="p[@outputclass='Body_Text_Answer'][b]" priority="10"> 
    <item num="{replace(node()[1], '^\s+', '')}"> 
     <para><xsl:apply-templates select="node()[position() gt 1]"/></para> 
    </item> 
    </xsl:template> 

    <xsl:template match="p[@outputclass='Body_Text_Answer']"> 
     <para><xsl:apply-templates/></para> 
    </xsl:template> 


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

输出我得到如:

<Body> 

    <para>AAAA.</para> 


    <item num="Q:"> 
     <para> Why?</para> 
    </item> 

    <item num="Q:"> 
     <para> What?</para> 
    </item> 

    <item num="A:"> 
     <para> In.</para> 
    </item> 

    <para>The</para> 


    <item num="Q:"> 
     <para> Why?</para> 
    </item> 

    <item num="Q:"> 
     <para> What?</para> 
    </item> 

    <item num="A:"> 
     <para> In.</para> 
    </item> 

    <para>The</para> 

</Body> 

预期的输出是(需要关闭该项目列表中的正常对位和orderlist后的所有问题和答案类型的结尾):

<Body> 

    <para>AAAA.</para> 

    <orderedlist type="manual"> 
    <item num="Q:"> 
     <para> Why?</para> 
    </item> 

    <item num="Q:"> 
     <para> What?</para> 
    </item> 

    <item num="A:"> 
     <para> In.</para> 


    <para>The</para></item> 


    <item num="Q:"> 
     <para> Why?</para> 
    </item> 

    <item num="Q:"> 
     <para> What?</para> 
    </item> 

    <item num="A:"> 
     <para> In.</para> 


    <para>The</para></item> 
    </orderedlist> 

</Body> 

我需要为这个问题和答案类型创建根元素(顺序列表)。我正在使用XSLT版本2.0。

回答

0

这个问题是类似于以下文章:

How to get the normal paras with different outpuclass as a section level tags

但明细表编制的要求是有点不同。你可以使用xsl:for-each-group/@ group-adjacent来解决这个问题。我添加了“Body”模板来控制分组。另一个模板不会从原始更改。

[样本样式]

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform 
    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:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/> 

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

    <xsl:template match="Body"> 
     <xsl:copy> 
      <xsl:for-each-group select="*" group-adjacent="boolean(self::p[@outputclass='Body_Text'])"> 
       <xsl:choose> 
        <xsl:when test="current-grouping-key()"> 
         <xsl:apply-templates select="current-group()"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <orderedlist type="manual"> 
          <xsl:for-each-group select="current-group()" group-adjacent="boolean(self::p[string(@outputclass) = ('Normal','Body_Text_Question')])"> 
           <xsl:choose> 
            <xsl:when test="current-grouping-key()"> 
             <xsl:apply-templates select="current-group()"/> 
            </xsl:when> 
            <xsl:otherwise> 
             <item> 
              <xsl:attribute name="num" select="replace(current-group()[1]/b[1], '^\s+', '')"/> 
              <xsl:apply-templates select="current-group()"/> 
             </item> 
            </xsl:otherwise> 
           </xsl:choose> 
          </xsl:for-each-group> 
         </orderedlist> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="p[@outputclass='Body_Text']"> 
     <para> 
      <xsl:apply-templates/> 
     </para> 
    </xsl:template> 

    <xsl:template match="p[@outputclass='Normal']"> 
     <item num="{replace(node()[1], '^\s+', '')}"> 
      <para><xsl:apply-templates select="node()[position() gt 1]"/></para> 
     </item> 
    </xsl:template> 

    <xsl:template match="p[@outputclass='Body_Text_Question'][b]"> 
     <item num="{replace(node()[1], '^\s+', '')}"> 
      <para><xsl:apply-templates select="node()[position() gt 1]"/></para> 
     </item> 
    </xsl:template> 

    <xsl:template match="p[@outputclass='Body_Text_Answer'][b]" priority="10"> 
     <para><xsl:apply-templates select="node() except b[position() eq 1]"/></para> 
    </xsl:template> 

    <xsl:template match="p[@outputclass='Body_Text_Answer']"> 
     <para><xsl:apply-templates/></para> 
    </xsl:template> 

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

</xsl:transform> 

[结果]

<Body> 
    <para>AAAA.</para> 
    <orderedlist type="manual"> 
     <item num="Q:"> 
      <para> Why?</para> 
     </item> 
     <item num="Q:"> 
      <para> What?</para> 
     </item> 
     <item num="A:"> 
      <para> In.</para> 
      <para>The</para> 
     </item> 
     <item num="Q:"> 
      <para> Why?</para> 
     </item> 
     <item num="Q:"> 
      <para> What?</para> 
     </item> 
     <item num="A:"> 
      <para> In.</para> 
      <para>The</para> 
     </item> 
    </orderedlist> 
</Body> 
+0

谢谢@tmakita – User515