动态打开和关闭标签xsl

时间:2013-09-13 20:57:30

标签: xml xslt teamsite interwoven

我正在使用teamsite和xsl来生成xsl的输出,我试图找出如何动态关闭和打开标签。问题是:我有一个包含许多组件的表单(teamsite表单),其中一个组件是行分隔符,当此组件添加到表单时,输出应生成此标记“ContainerType Row2Col1 ContainerType>”并关闭组件和容器标签并重新打开标签。 这就是我这样做的方式!

可以添加或不添加RowDivider ..它取决于用户将在页面上使用的模板。

用这种方式...我收到以下错误消息“文件过早结束”,我知道这是因为我关闭并重新打开rowdivider部分的标签,但我不知道如何解决它!

 <Container>
 <ContainerType>Row2Col1</ContainerType>                    
            <Components>
                <xsl:for-each select="content/ContentContainer">
                    <xsl:for-each select="CTA">
                        <Component>
                        <ComponentType>CTA</ComponentType>

                        </Component>
                    </xsl:for-each>
                    <xsl:for-each select="BodyText">
                        <Component>
                            <ComponentType>BodyText</ComponentType>
                            <Attributes>
                                <Attribute>
                                    <Key>HtmlText</Key> 
                                    <Value>
                                        <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
                                        <xsl:value-of select="BodyText" disable-output-escaping="yes"/>
                                        <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
                                    </Value>                            
                                </Attribute>
                            </Attributes>
                        </Component>
                    </xsl:for-each>
                        <xsl:for-each select="RowDivider">
                                </Components>
                                </Container>
                                <Container>
                                <Components>
                        <ContainerType>Row3Col1</ContainerType>
                        </xsl:for-each> 
                </xsl:for-each> 
            </Components>
        </Container>

这应该是输出

         <Container>
    <ContainerType>Row2Col1</ContainerType>
    <Components>
        <Component>
            <ComponentType>BodyText</ComponentType>
            <Attributes>
                <Attribute>
                    <Key>HtmlText</Key>
                    <Value>
                        <![CDATA[ <p>Text</p>  ]]>
                    </Value>
                </Attribute>
            </Attributes>
        </Component>
        <Component>
            <ComponentType>CTA</ComponentType>
        </Component>
    </Components>
</Container>
<Container>
    <ContainerType>Row3Col1</ContainerType>
    <Components>
        <Component>
            <ComponentType>BodyText</ComponentType>
            <Attributes>
                <Attribute>
                    <Key>HtmlText</Key>
                    <Value>
                        <![CDATA[ <p>Text</p>  ]]>
                    </Value>
                </Attribute>
            </Attributes>
        </Component>
    </Components>
</Container>

2 个答案:

答案 0 :(得分:2)

第1课:XSLT文件是一个XML文件,因此必须格式正确。

XML文件被视为节点树,而不是开始标记和结束标记的集合。 XSLT样式表本质上是声明性的,不能以强制方式用于任意吐出标记,因为它不处理标记。 XSLT处理器中的XML处理器担心标签,以便为XSLT处理器节点提供支持。

因此,必须将命令式标记方法更改为声明性节点方法,从输入数据中自上而下(未显示)。

答案 1 :(得分:1)

XSLT不生成标签,它会生成树。你必须考虑生成一个节点树作为样式表的输出;作为可选步骤,可以将此结果树序列化为XML。

显然,一棵树不能包含半个节点;创建节点是一种原子操作。

我没有尝试从您对解决方案的错误尝试中反向设计您的要求,但这里通常的问题是您希望在输出文档中生成与输入文档中的多个节点对应的一个节点。这通常被称为“分组”,一旦您知道“分组”是要搜索的索引术语,您就会在XSLT文献中找到大量信息。您应该注意到,在XSLT 2.0中,分组问题比在1.0中更容易处理 - 但1.0中也有很多技术。