如何在xslt 2.0中使用递归函数调用创建动态xml元素? [英] How to create dynamic xml element using recursive function call in xslt 2.0?

查看:86
本文介绍了如何在xslt 2.0中使用递归函数调用创建动态xml元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我想通过使用xslt 2.0 transform将一个xml文件转换为另一个xml文件.
我打了一些递归调用.

这是XML文件

 <   pre     lang   ="  >  <?  xml    版本  ="    编码  ="  UTF-8" 独立  ="  ? > 
<   w:document     xmlns:w   ="  <   w:body  > 
    <   w:p  > 
        <   w:pPr  > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text1 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 

    <   w:p  > 
        <   w:pPr  > 
            <   w:pStyle     w:val   ="    / > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text2 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 

    <   w:p  > 
        <   w:pPr  > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text3 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 

    <   w:p  > 
        <   w:pPr  > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text4 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 

    <   w:p  > 
        <   w:pPr  > 
            <   w:pStyle     w:val   ="    / > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text5 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 

    <   w:p  > 
        <   w:pPr  > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text6 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 

    <   w:p  > 
        <   w:pPr  > 
            <   w:pStyle     w:val   ="    / > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text7 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 

    <   w:p  > 
        <   w:pPr  > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text8 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 

    <   w:p  > 
        <   w:pPr  > 
            <   w:pStyle     w:val   ="    / > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text9 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 

    <   w:p  > 
        <   w:pPr  > 
        <  /w:pPr  > 
        <   w:r  > 
            <   w:t  >  Text10 -<  /w:t  > 
        <  /w:r  > 
    <  /w:p  > 


<  /w:body  > 
<  /w:document  >  





XSL文件是

 <   pre     lang   ="  >  <   xsl:stylesheet  
 
     版本  ="  
 
      xmlns:xsl   ="  
 
      xpath-default-namespace   ="  
 
      xmlns:w   ="  
 
      xmlns:xs   ="  
      xmlns:mf   ="  
 
     排除结果前缀  ="  > 

<   xsl:output    缩进  ="  > 

<   xsl:function    名称  ="    作为  ="  element()*" <   xsl:param    名称  ="  作为  元素()*" > 
  <   xsl:param    名称  ="  作为   xs :integer" > 
  <   xsl:for-each-group    选择  ="  $ paragraphs"    group-starting-with   ="  p [pPr/pStyle/@ w:val = concat('Heading',$ level)]" <   xsl:choose  > 
      <   xsl:何时   测试  ="  <   xsl:element    名称  ="  > 
          <  标题 >  <   xsl:value-of    选择  ="  >  /标题 <   xsl:sequence    选择  ="  > 
        <  /xsl:element  > 
      <  /xsl:何时 > 
      <   xsl:否则 > 
        <   xsl:apply-templates    选择  ="  / > 
      <  /xsl:otherwise  > 
    <  /xsl:choose  > 
  <  /xsl:for-each-group  > 
<  /xsl:function  > 

<   xsl:template    匹配  ="  <  文档 > 
    <   xsl:sequence    选择  ="  / > 
  <  /Document  > 
<  /xsl:template  > 

<   xsl:template    匹配  ="  <  段落 > 
    <   xsl:value-of    选择  ="  r/t" / > 
  <  /段落 > 
<  /xsl:template  > 

<  /xsl:stylesheet  >  





我的必需输出是:

 <  文档 > ; 
   <  段落 >  Text1- <  /paragraph  > 
   <   Heading2  > 
      <  标题 >  Text2- <  /Title  > 
      <  段落 > 文本3- <  /paragraph  > 
      <  段落 > 文本4- <  /paragraph  > 
    <  /Heading2  > 
      <   Heading2  > 
         <  标题 >  Text5- <  /Title  > 
         <  段落 >  Text6- <  /paragraph  > 
         <   Heading3  > 
            <  标题 >  Text7- <  /Title  > 
            <  段落 >  Text8- <  /paragraph  > 
         <  /Heading3  > 
      <  /Heading2  > 
   <   Heading1  > 
      <  标题 >  Text9- <  /Title  > 
      <  段落 >  Text10- <  /paragraph  > 
   <  /Heading1  > 
<  /document  >  



请引导我解决此问题...

解决方案

段落" group-starting-with =" < xsl:choose > < xsl:何时 测试 =" < xsl:element 名称 =" <pre lang="xml"><?xml version="1.0" encoding="UTF-8" standalone="yes"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> <w:pPr> </w:pPr> <w:r> <w:t>Text1-</w:t> </w:r> </w:p> <w:p> <w:pPr> <w:pStyle w:val="Heading2" /> </w:pPr> <w:r> <w:t>Text2-</w:t> </w:r> </w:p> <w:p> <w:pPr> </w:pPr> <w:r> <w:t>Text3-</w:t> </w:r> </w:p> <w:p> <w:pPr> </w:pPr> <w:r> <w:t>Text4-</w:t> </w:r> </w:p> <w:p> <w:pPr> <w:pStyle w:val="Heading2" /> </w:pPr> <w:r> <w:t>Text5-</w:t> </w:r> </w:p> <w:p> <w:pPr> </w:pPr> <w:r> <w:t>Text6-</w:t> </w:r> </w:p> <w:p> <w:pPr> <w:pStyle w:val="Heading3" /> </w:pPr> <w:r> <w:t>Text7-</w:t> </w:r> </w:p> <w:p> <w:pPr> </w:pPr> <w:r> <w:t>Text8-</w:t> </w:r> </w:p> <w:p> <w:pPr> <w:pStyle w:val="Heading1" /> </w:pPr> <w:r> <w:t>Text9-</w:t> </w:r> </w:p> <w:p> <w:pPr> </w:pPr> <w:r> <w:t>Text10-</w:t> </w:r> </w:p> </w:body> </w:document>





XSL FILE is

<pre lang="xml"><xsl:stylesheet

  version="2.0"

  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

  xpath-default-namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"

  xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"

  xmlns:xs="http://www.w3.org/2001/XMLSchema"

  xmlns:mf="http://example.com/mf"

  exclude-result-prefixes="xs w mf">

<xsl:output indent="yes"/>

<xsl:function name="mf:group" as="element()*">
  <xsl:param name="paragraphs" as="element()*"/>
  <xsl:param name="level" as="xs:integer"/>
  <xsl:for-each-group select="$paragraphs" group-starting-with="p[pPr/pStyle/@w:val = concat('Heading', $level)]">
    <xsl:choose>
      <xsl:when test="self::p[pPr/pStyle/@w:val = concat('Heading', $level)]">
        <xsl:element name="Heading{$level}">
          <Title><xsl:value-of select="r/t"/></Title>
          <xsl:sequence select="mf:group(current-group() except ., $level + 1)"/>
        </xsl:element>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="current-group()"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
</xsl:function>

<xsl:template match="document">
  <Document>
    <xsl:sequence select="mf:group(body/p, 1)"/>
  </Document>
</xsl:template>

<xsl:template match="p">
  <Paragraph>
    <xsl:value-of select="r/t"/>
  </Paragraph>
</xsl:template>

</xsl:stylesheet>





My Required Output is :

<document>
   <paragraph>Text1-</paragraph>
   <Heading2>
      <Title>Text2-</Title>
      <paragraph>Text3-</paragraph>
      <paragraph>Text4-</paragraph>
    </Heading2>
      <Heading2>
         <Title>Text5-</Title>
         <paragraph>Text6-</paragraph>
         <Heading3>
            <Title>Text7-</Title>
            <paragraph>Text8-</paragraph>
         </Heading3>
      </Heading2>
   <Heading1>
      <Title>Text9-</Title>
      <paragraph>Text10-</paragraph>
   </Heading1>
</document>



Please Guide me to get out of this issue...

解决方案

paragraphs" group-starting-with="p[pPr/pStyle/@w:val = concat('Heading',


level)]"> <xsl:choose> <xsl:when test="self::p[pPr/pStyle/@w:val = concat('Heading',


level)]"> <xsl:element name="Heading{


这篇关于如何在xslt 2.0中使用递归函数调用创建动态xml元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆