Xslt 克服xsl中未关闭的标记
我正在使用一个下拉菜单,从Sharepoint列表中提取数据,并使用xsl设置样式。html结构是一个简单的无序列表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测试列表中的项目是父页面还是子页面,以及子页面的编号。父页面有一个编号,因此
<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中添加“第一个子页”和“最后一个子页”