Объединение узлов в XSL и помещение значения в атрибут HTML «title» - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть данные XML в форме вроде:

<Parent>
    <Child>Value1</Child>
    <Child>Value2</Child>
    <Child>Value3</Child>
    .
    .
    .
</Parent>

Я должен установить атрибут HTML title тега включения в объединенные значения, что-то вроде:

<xsl:attribute name="title">Value1,Value2,Value3,.,.,.</xsl:attribute>

Я проверил вопросы, заданные ранее по SO, но большинство решений были многострочными (и являются новыми для XSL). Я думаю, что я не могу включить многострочный код в мои теги <xsl:attribute></xsl:attribute>. Как это сделать?

Ответы [ 4 ]

3 голосов
/ 15 ноября 2011

Решение XSLT 2.0 :

<xsl:stylesheet version="2.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="Parent">
     <Parent title="{string-join(Child, ', ')}"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML :

<Parent>
    <Child>Value1</Child>
    <Child>Value2</Child>
    <Child>Value3</Child>
</Parent>

желаемый, правильный результат получается :

<Parent title="Value1, Value2, Value3"/>

Или, если кто-то хочет переопределить правило идентификации для большей гибкости :

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

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="Child[1]">
  <xsl:attribute name="title" select="string-join(../Child, ', ')"/>
 </xsl:template>

 <xsl:template match="Child"/>
</xsl:stylesheet>

Когда это преобразование применяется к тому же XML-документу (см. Выше), тот же требуемый, правильный результат снова выдается :

<Parent title="Value1, Value2, Value3"/>
2 голосов
/ 15 ноября 2011
<xsl:template match="Parent">
  <xsl:attribute name="title">
   <xsl:for-each select="Child">
     <xsl:if test="position() != 1">, </xsl:if>
     <xsl:value-of select="."/>
   </xsl:for-each>
  </xsl:attribute>
</xsl:template>
1 голос
/ 15 ноября 2011
<xsl:template match="Parent">
  <xsl:attribute name="title">
   <xsl:for-each select="Child">
     <xsl:value-of select="."/>
     <xsl:if test="not(position()=last())">, </xsl:if>
   </xsl:for-each>
  </xsl:attribute>
</xsl:template>
0 голосов
/ 15 ноября 2011

Я не знаю много о xsl, но есть функция xpath string-join , которую можно использовать, может быть в xsl, так что количество строк можно уменьшить. Я обычно использую эту функцию в Orbeon Xforms.

string-join(/Parent/Child, ',')

Ссылка: http://www.w3schools.com/xpath/xpath_functions.asp

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