XSLT和错放的HTML标记

时间:2014-02-13 23:07:11

标签: html xslt

我正在研究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[]]>但是我只是将标记作为字符串在输出中逐字打印。

2 个答案:

答案 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 &lt;= $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 &lt;= $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解析器不会像这样继续。