Xml 从XSLT 2中元素值的语义层次结构创建父子元素
我在XML内容中有一系列的p标记,它们的起始值具有语义层次结构,但是,p标记是线性的。正在查找XSLT2转换 语义层次如下:Xml 从XSLT 2中元素值的语义层次结构创建父子元素,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我在XML内容中有一系列的p标记,它们的起始值具有语义层次结构,但是,p标记是线性的。正在查找XSLT2转换 语义层次如下: (1) +-(a) +-(I) +-(A) <xsl:param name="patternOrder" as="element(pattern)*" xmlns=""> <pattern level="1" value="^(\([0-9]+(\.[0-9]+)?\))" /> <pattern level
(1)
+-(a)
+-(I)
+-(A)
<xsl:param name="patternOrder" as="element(pattern)*" xmlns="">
<pattern level="1" value="^(\([0-9]+(\.[0-9]+)?\))" />
<pattern level="2" value="^(\([a-z]\))" />
<pattern level="3" value="^(\((IX|IV|V?I{{0,3}})\))" />
<pattern level="4" value="^(\([\w]+(\.[\w]+)?\))" />
</xsl>
使用正则表达式序列,如下所示:
(1)
+-(a)
+-(I)
+-(A)
<xsl:param name="patternOrder" as="element(pattern)*" xmlns="">
<pattern level="1" value="^(\([0-9]+(\.[0-9]+)?\))" />
<pattern level="2" value="^(\([a-z]\))" />
<pattern level="3" value="^(\((IX|IV|V?I{{0,3}})\))" />
<pattern level="4" value="^(\([\w]+(\.[\w]+)?\))" />
</xsl>
*编辑#2*
使用水平属性:
<?xml version="1.0" encoding="UTF-8"?>
<test>
<content>
<p level="1">(1) blah</p>
<p level="1">(2)</p>
<p level="2">(a) blah</p>
<p level="2">(b) blah</p>
<p level="1">(3)</p>
<p level="2">(a)</p>
<p level="3">(I) blah</p>
<p level="3">(II) blah</p>
<p level="4">(A) blah</p>
<p level="4">(B.1) blah</p>
<p level="2">(b) blah</p>
<p level="1">(4) blah</p>
<p level="1">(4.5) blah</p>
<p level="1">(5)</p>
<p level="2">(a)</p>
<p level="3">(I)</p>
<p level="4">(A) blah</p>
<p level="4">(B) blah</p>
<p level="3">(II) blah</p>
<p level="3">(III)</p>
<p level="2">(a) blah</p>
<p level="2">(bb.2) blah</p>
<p level="2">(6) blah</p>
</content>
<content>
<p>blah</p>
</content>
<content>
<p>blah</p>
<p level="1">(1) blah</p>
<p level="2">(a) blah</p>
<p level="2">(b) blah</p>
<p level="1">(2) blah </p>
</content>
</test>
(1)废话
(2)
(a)废话
(b)废话
(3)
(a)
(I)诸如此类
(II)废话
(A)废话
(B.1)诸如此类
(b)废话
(4)废话
(4.5)废话
(5)
(a)
(I)
(A)废话
(B)废话
(II)废话
(三)
(a)废话
(bb.2)诸如此类
(6)废话
废话
废话
(1)废话
(a)废话
(b)废话
(2)废话
第一阶段:转换
<p>(2)(a) blah</p>
<p>(b) blah</p>
(2)(a)诸如此类
(b) 废话
进入
(2)
(a) 废话
(b) 废话
使用类似
<xsl:template match="p">
<xsl:for-each select="tokenize(., '\(')">
<xsl:if test="normalize-space(.)">
<p>(<xsl:value-of select="."/></p>
</xsl:if>
</xsl:for-each>
</xsl:template>
(
第二阶段:
首先写一个函数
<xsl:function name="f:level" as="xs:integer">
<xsl:param name="p" as="element(p)"/>
....
</xsl:function>
....
它基于匹配正则表达式来计算“语义级别”。您似乎知道如何完成这一部分
然后编写一个递归分组函数:
<xsl:function name="f:group" as="element(p )*">
<xsl:param name="in" as="element(p )*"/>
<xsl:param name="level" as="xs:integer"/>
<xsl:for-each-group select="$in" group-starting-with="p[f:level(.)=$level]">
<p><xsl:value-of select="current-group()[1]"/>
<xsl:sequence select="f:group(current-group()[position() gt 1], $level+1)"/>
</p>
</xsl:for-each-group>
</xsl:function>
并按如下方式调用此函数:
<xsl:template match="content">
<xsl:sequence select="f:group(p, 1)"/>
</xsl:template>
未测试。计算出第1阶段-编辑您的答案。现在要计算出如何为递归组函数进行平级标记以使用!计算出如何进行平级标记。但是,重新恢复的分组函数在序列上以0参数函数的形式返回。将答案编辑为(希望如此)修复此错误。这就完成了编辑!我为f:group的递归调用使用了各种参数-第二个参数为$level+1,但无法确定当前组具有[position()gt 1]。谢谢!通过此操作,我确实学到了很多。
<xsl:function name="f:group" as="element(p )*">
<xsl:param name="in" as="element(p )*"/>
<xsl:param name="level" as="xs:integer"/>
<xsl:for-each-group select="$in" group-starting-with="p[f:level(.)=$level]">
<p><xsl:value-of select="current-group()[1]"/>
<xsl:sequence select="f:group(current-group()[position() gt 1], $level+1)"/>
</p>
</xsl:for-each-group>
</xsl:function>
<xsl:template match="content">
<xsl:sequence select="f:group(p, 1)"/>
</xsl:template>