如何在xslt 2.0中使用递归函数调用创建动态xml元素? [英] How to create dynamic xml element using recursive function call in xslt 2.0?
本文介绍了如何在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屋!
查看全文