Динамически открывать и закрывать теги 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"><![CDATA[</xsl:text>
<xsl:value-of select="BodyText" disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes">]]></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.
Поэтому ваш подход к императивному тегу должен быть изменен на подход декларативного узла, работающий сверху вниз из ваших входных данных, которые вы не показываете.