Динамически открывать и закрывать теги xsl

Я работаю с TeamSite и XSL для создания выходных данных с XSL, я пытаюсь выяснить, как закрывать и открывать теги динамически. Проблема заключается в следующем: у меня есть форма (форма объединенного сайта) со многими компонентами, один из этих компонентов является разделителем строк. Когда этот компонент добавляется в форму, выходные данные должны генерировать этот тег "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 ответа

Решение

XSLT не производит теги, он создает дерево. Вы должны думать с точки зрения создания дерева узлов как результата вашей таблицы стилей; в качестве необязательного шага это дерево результатов может затем быть сериализовано в XML.

Очевидно, что дерево не может содержать половину узла; Создание узла - это атомарная операция.

Я не пытался перепроектировать ваше требование из-за вашей неправильной попытки найти решение, но обычная проблема здесь заключается в том, что вы хотите создать один узел в выходном документе, который соответствует нескольким узлам во входном документе. Это общеизвестно как "группировка", и вы найдете много информации в литературе по XSLT, когда узнаете, что "группировка" является индексным термином для поиска. Вы должны заметить, что проблемы с группировкой в ​​XSLT 2.0 гораздо проще решать, чем в 1.0, но в 1.0 также есть множество методов.

Урок 1: XSLT-файл является XML-файлом и поэтому должен быть правильно сформирован.

Файл XML рассматривается как дерево узлов, а не как набор начальных и конечных тегов. Таблица стилей XSLT носит декларативный характер и не может быть принудительно использована для произвольного выделения тегов, поскольку она не работает с тегами. Процессор XML в процессоре XSLT беспокоится о тегах, чтобы предоставить узлы процессора XSLT.

Поэтому ваш подход к императивному тегу должен быть изменен на подход декларативного узла, работающий сверху вниз из ваших входных данных, которые вы не показываете.

Другие вопросы по тегам