Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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
Xslt 克服xsl中未关闭的标记_Xslt_Sharepoint_Tags - Fatal编程技术网

Xslt 克服xsl中未关闭的标记

Xslt 克服xsl中未关闭的标记,xslt,sharepoint,tags,Xslt,Sharepoint,Tags,我正在使用一个下拉菜单,从Sharepoint列表中提取数据,并使用xsl设置样式。html结构是一个简单的无序列表 <ul><li>parent page</li><ul><li>sub page 1</li><li>sub page2</li></ul></ul> 父页面子页面1子页面2 xsl测试列表中的项目是父页面还是子页面,以及子页面的编号。父页面有一个编号,因此

我正在使用一个下拉菜单,从Sharepoint列表中提取数据,并使用xsl设置样式。html结构是一个简单的无序列表

<ul><li>parent page</li><ul><li>sub page 1</li><li>sub page2</li></ul></ul>
  • 父页面
    • 子页面1
    • 子页面2
xsl测试列表中的项目是父页面还是子页面,以及子页面的编号。父页面有一个编号,因此所需的子页面可以附加到正确的父页面

每个项目的基本xsl如下所示:

<xsl:for-each select="//Data/Row">
    <xsl:if test="./@Page_x0020_type = 0">
        <li >
            <a>
                <xsl:attribute name="href">
                    <xsl:value-of
                     select="./@Page_x002f_link_x0020_url"/>
                </xsl:attribute>
                <xsl:value-of select="./@Title0"/>
            </a>
        </li>
    </xsl:if>

  • 我希望xsl等同于: 如果是子页,则在项目前面加上ul标签,如果是父项下的最后一个子页,则添加结束ul标签

    xsl不允许我添加一个未关闭的ul标记,因为它(正确地)不知道标记是否会关闭,我该如何回避这个事实

    XML

    
    0
    1.
    =0  
    0
    

    更新: 页面类型:
    • 父级
    • 父级1
    • 子页1-需要以子页1开始
    • 中间子页-(编号以设置排序顺序html与父页相同)
    • 子页35;
    • 组中的最后一个子页-需要以

      我错过了一些东西。因为XSL是一个XML文档,可用于将另一个XML(XHTML、SOAP等)文档转换为另一种格式,通常是某种XML。如果将数据文档(字符串等)馈送到XSL中,它将根据您设置的模式进行转换,该模式必须是有效的XML

      现在,为什么在你的例子中这是一个问题。您是否只构建结构的一部分,然后将其添加到另一部分,直到拥有整个结构?如果是这样的话,我会将所有的位拉入一段数据(文件、字符串等),并对其运行转换。或者,将占位符保留在最高级别,正确地进行结尾标记,并以这种方式添加子位


      看看你的问题,我发现你想要一个有效的和一个无效的,这让我相信你在试图拼凑出一个解决方案。不幸的是,我不知道如何告诉XSL“嘿,这是无效的XML,但不要担心。”

      我遗漏了一些东西。因为XSL是一个XML文档,可用于将另一个XML(XHTML、SOAP等)文档转换为另一种格式,通常是某种XML。如果将数据文档(字符串等)馈送到XSL中,它将根据您设置的模式进行转换,该模式必须是有效的XML

      现在,为什么在你的例子中这是一个问题。您是否只构建结构的一部分,然后将其添加到另一部分,直到拥有整个结构?如果是这样的话,我会将所有的位拉入一段数据(文件、字符串等),并对其运行转换。或者,将占位符保留在最高级别,正确地进行结尾标记,并以这种方式添加子位

      看看你的问题,我发现你想要一个有效的和一个无效的,这让我相信你在试图拼凑出一个解决方案。不幸的是,我不知道如何告诉XSL“嘿,这是无效的XML,但不要担心”

      我希望xsl与此等价:如果它是一个子页面,则在该项前面加上ul标记,如果它是父项下的最后一个子页面,则添加一个结束ul标记

      你想错了。XSLT不写标记,而是写一个节点树。不能将半个节点写入结果树

      在XSLT 2.0中,对于以属性开头的组,您可能可以使用xsl:为每个组执行您想要的操作-我不能具体说明,因为您没有足够清楚地指定问题,但可能是这样的:

      <xsl:template match="parent">
        <xsl:for-each-group select="*" group-starting-with="li[....]">
          <ul>
            <xsl:copy-of select="current-group()"/>
          </ul>
        </xsl:for-each-group>
      </xsl:template>
      
      
      
      如果您坚持使用XSLT1.0,那么将更加困难:我将使用一种称为“同级递归”的技术,在这种技术中,您将模板应用于第一个子级,然后将模板应用于下一个子级,依此类推。父级的模板规则执行以下操作:

      <xsl:template match="parent">
        <xsl:apply-templates select="*[1]"/>
      </xsl:template>
      
      <xsl:template match="parent/*[ (: where this is the first in a group :) ]">
        <group>
          <xsl:copy-of select="."/>
          <xsl:apply-templates select="following-sibling::*[1]"/>
        </group>
        <xsl:apply-templates select="following-sibling::*[(* start of next group *)][1]"/>
      </xsl:template>
      
      
      
      要成为组中第一个同级的模板规则执行以下操作:

      <xsl:template match="parent">
        <xsl:apply-templates select="*[1]"/>
      </xsl:template>
      
      <xsl:template match="parent/*[ (: where this is the first in a group :) ]">
        <group>
          <xsl:copy-of select="."/>
          <xsl:apply-templates select="following-sibling::*[1]"/>
        </group>
        <xsl:apply-templates select="following-sibling::*[(* start of next group *)][1]"/>
      </xsl:template>
      
      
      
      其他同级的模板规则执行以下操作:

      <xsl:template match="parent/*">
        <xsl:copy-of select="."/>
        <xsl:apply-templates select="following-sibling::*[1]"/>
      </xsl:template>
      
      
      
      即使对于有经验的XSLT开发人员来说,细节也可能很棘手

      我希望xsl与此等价:如果它是一个子页面,则在该项前面加上ul标记,如果它是父项下的最后一个子页面,则添加一个结束ul标记

      你想错了。XSLT不写标记,而是写一个节点树。不能将半个节点写入结果树

      在XSLT 2.0中,对于以属性开头的组,您可能可以使用xsl:为每个组执行您想要的操作-我不能具体说明,因为您没有足够清楚地指定问题,但可能是这样的:

      <xsl:template match="parent">
        <xsl:for-each-group select="*" group-starting-with="li[....]">
          <ul>
            <xsl:copy-of select="current-group()"/>
          </ul>
        </xsl:for-each-group>
      </xsl:template>
      
      
      
      如果您坚持使用XSLT1.0,那么将更加困难:我将使用一种称为“同级递归”的技术,在这种技术中,您将模板应用于第一个子级,然后将模板应用于下一个子级,依此类推。父级的模板规则执行以下操作:

      <xsl:template match="parent">
        <xsl:apply-templates select="*[1]"/>
      </xsl:template>
      
      <xsl:template match="parent/*[ (: where this is the first in a group :) ]">
        <group>
          <xsl:copy-of select="."/>
          <xsl:apply-templates select="following-sibling::*[1]"/>
        </group>
        <xsl:apply-templates select="following-sibling::*[(* start of next group *)][1]"/>
      </xsl:template>
      
      
      
      要成为组中第一个同级的模板规则执行以下操作:

      <xsl:template match="parent">
        <xsl:apply-templates select="*[1]"/>
      </xsl:template>
      
      <xsl:template match="parent/*[ (: where this is the first in a group :) ]">
        <group>
          <xsl:copy-of select="."/>
          <xsl:apply-templates select="following-sibling::*[1]"/>
        </group>
        <xsl:apply-templates select="following-sibling::*[(* start of next group *)][1]"/>
      </xsl:template>
      
      
      
      其他同级的模板规则执行以下操作:

      <xsl:template match="parent/*">
        <xsl:copy-of select="."/>
        <xsl:apply-templates select="following-sibling::*[1]"/>
      </xsl:template>
      
      
      

      即使对于有经验的XSLT开发人员来说,细节也可能很棘手。

      您还需要以不同的方式制定算法。从元素的嵌套方式来考虑,而不是从哪个打开或关闭标记在哪个文本之前来考虑。@matt:你的问题是你没有从声明性范例来考虑。但是,如果没有一个显示父子关系是如何表达的输入源,你很难得到答案。@John,你能详细说明一下吗?我可以在x中添加“第一个子页”和“最后一个子页”