Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 从XSLT 2中元素值的语义层次结构创建父子元素_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

Xml 从XSLT 2中元素值的语义层次结构创建父子元素

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

我在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="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>