我正在研究Use child position to create a grid in XSLT我认为我目前的具体问题需要一个新问题。
<xsl:template match ="//Sub/Node">
<xsl:if test="count(./preceding-sibling::*) mod (count(../Node) div ../../Rows/text()) = 0">
<div class ="row"></div>
</xsl:if>
<div class ="col-lg-{12 div count(../Node)}">
<xsl:apply-templates />
</div>
<xsl:if test="count(./preceding-sibling::*) mod (count(../Node) div ../../Rows/text()) = 1">
<div class ="rowclose"></div>
</xsl:if>
</xsl:template>
我正在尝试从它的XML描述中生成一个引导网格。输出是:
<div class="container-fluid">
<div class="row"></div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
<div class="rowclose"></div>
<div class="row"></div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
<div class="rowclose"></div>
</div>
哪个接近但不完全(除了col-lg-数字错误但很容易修复)。如果我将<div class="row"></div>
替换为<div class="row">
而将<div class="rowclose"></div>
替换为</div>
,则我的IDE会抱怨错误的代码并且页面无法正确加载。
有什么方法吗?
编辑:我尝试使用<CDATA[]]>
但是我只是将标记作为字符串在输出中逐字打印。
答案 0 :(得分:1)
我设法使用递归模板:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:variable name="rows" select="/Node/Rows" />
<xsl:variable name="cols" select="/Node/Cols" />
<xsl:variable name="grid-units" select="12 div $cols" />
<xsl:template match ="/Node">
<div class="container-fluid">
<xsl:call-template name="make-row" />
</div>
</xsl:template>
<xsl:template name="make-row">
<xsl:param name="ri" select="1"/>
<xsl:if test="$ri <= $rows">
<div class="row">
<xsl:call-template name="make-col">
<xsl:with-param name="ri" select="$ri"/>
</xsl:call-template>
</div>
<xsl:call-template name="make-row">
<xsl:with-param name="ri" select="$ri + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="make-col">
<xsl:param name="ci" select="1"/>
<xsl:param name="ri"/>
<xsl:if test="$ci <= $cols">
<div class="col-lg-{$grid-units}">
<xsl:value-of select="Node[1 + ($ci - 1) mod $cols + $cols * ($ri - 1)]"/>
</div>
<xsl:call-template name="make-col">
<xsl:with-param name="ci" select="$ci + 1"/>
<xsl:with-param name="ri" select="$ri"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
如果您将此作为来源使用:
<Node>
<UI>Grid</UI>
<Rows>4</Rows>
<Cols>2</Cols>
<Node>One</Node>
<Node>Two</Node>
<Node>Three</Node>
<Node>Four</Node>
<Node>Five</Node>
<Node>Six</Node>
<Node>Seven</Node>
<Node>Eight</Node>
<Node>Nine</Node>
</Node>
你会得到这个:
<?xml version="1.0" encoding="UTF-8"?>
<div class="container-fluid">
<div class="row">
<div class="col-lg-6">One</div>
<div class="col-lg-6">Two</div>
</div>
<div class="row">
<div class="col-lg-6">Three</div>
<div class="col-lg-6">Four</div>
</div>
<div class="row">
<div class="col-lg-6">Five</div>
<div class="col-lg-6">Six</div>
</div>
<div class="row">
<div class="col-lg-6">Seven</div>
<div class="col-lg-6">Eight</div>
</div>
</div>
如果您更改了源中<Rows>
和<Cols>
的值,它将分发Node
字段,直到它们为空,将它们放在正确的列或行中。
答案 1 :(得分:0)
我暂时没有制作XSLT,但如果我知道我已经遇到了同样的问题,我认为这是由于语法原因造成的。它与HTML中的规则相同: 如果在父项中打开标记,则无法在子标记之前关闭父标记。
在XSL中,您使用xsl:if标记,然后编写div标记。您想在div之前关闭xsl:if标记。
尝试更改一下代码来检查一下。
如果我读了你的代码,我发现你想稍后关闭它,但是XSL解析器不会像这样继续。