Проблема разрыва строки XSLT - PullRequest
1 голос
/ 06 апреля 2011

Я пытаюсь произвести вывод html в соответствии с полями в файле xml с помощью xslt.И я называю их в соответствии с отношением «дедушка-родитель-ребенок-внук» в xml

Например:

<root>
  <node1>
      <node2>
         <node3>Data</node3>
      </node2>
  </node1>

Мне нужно создать, скажем, текстовое поле симя node1__node2__node3 То, что я до сих пор делал, это

<input type="text" name="node1__
        node2__
        node3__"

Но я хочу:

<input type="text" name="node1__node2__node3__"/>

Так что это бесполезно.Мой xslt для создания этого бесполезного вывода:

<xsl:template name="chooseNameID">
    <xsl:param name="currentNode"/><!-- in this case currentNode is node3 -->
    <xsl:variable name="fieldNames">
        <xsl:for-each select="$currentNode/ancestor::*">
                <xsl:value-of select="name(.)"/>__
        </xsl:for-each>
    </xsl:variable>

    <xsl:attribute name="name">
        <xsl:value-of select="$fieldNames"/>                            
    </xsl:attribute>

</xsl:template>

Я думаю, проблема в <xsl:value-of, но я не могу найти никакого решения для этого.

Спасибо

Ответы [ 3 ]

1 голос
/ 06 апреля 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node3">
    <xsl:variable name="vName">
     <xsl:for-each select=
      "ancestor-or-self::*[not(position()=last())]">
        <xsl:value-of select="name()"/>
        <xsl:if test="not(position()=last())">__</xsl:if>
     </xsl:for-each>
    </xsl:variable>

    <input type="text" name="{$vName}"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу :

<root>
    <node1>
        <node2>
            <node3>Data</node3>
        </node2>
    </node1>
</root>

создает искомое, правильный результат:

<input type="text" name="node1__node2__node3"/>

Примечание: : Использование AVT (шаблон значения атрибута) для генерации требуемого вывода в одну короткую строку.

1 голос
/ 06 апреля 2011

Нежелательные пробелы, включая символы новой строки, являются частью литерала текстового узла в цикле.

В документе таблицы стилей текстовые узлы, содержащие только пробелы, игнорируются, кроме как внутри xsl:text.Однако пробел, примыкающий к другому тексту, является частью этого текста.

Буквенными пробелами в таблице стилей можно управлять с помощью xsl:text.

    <!-- change this -->
    <xsl:for-each select="$currentNode/ancestor::*">
        <xsl:value-of select="name(.)"/>__
    </xsl:for-each>

    <!-- to this -->
    <xsl:for-each select="$currentNode/ancestor::*">
        <xsl:value-of select="name(.)"/>__<xsl:text/>
    </xsl:for-each>

    <!-- or this -->
    <xsl:for-each select="$currentNode/ancestor::*">
        <xsl:value-of select="name(.)"/>
        <xsl:text>__</xsl:text>
    </xsl:for-each>
0 голосов
/ 06 апреля 2011

Как обычно, после задания вопроса вы находите решение.

Изменение строки <xsl:value-of select="$fieldNames"/> на эту <xsl:value-of select="normalize-space($fieldNames)" сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...