0

我与 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>
4

2 回答 2

2

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

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

因此,您的命令式标记方法必须更改为声明性节点方法,从您的输入数据自上而下工作,您没有显示。

于 2013-09-13T23:28:44.860 回答
1

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

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

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

于 2013-09-14T08:13:57.347 回答