Расширение результирующего атрибута узла xml - PullRequest
1 голос
/ 12 января 2012

Вопрос для тех, кто знаком с xslt.Вкратце - мне нужно расширить атрибут несколько раз одним преобразованием.кто нибудь знает как это сделать?Например, у меня есть xml

<article type="funny">
   <firstclass>big</firstclass>
   <secondclass>smooth</secondclass>
   hot-dog
</article>

, и мне нужно иметь вывод:

<div class="funny big smooth">hot-dog</div>

Может ли это быть сделано с отдельным шаблоном для каждого тега или атрибута (первый класс, второй класс и тип)?

Конечно, я могу напечатать что-то вроде этого:

<xsl:attribute>
   <xsl:value-of select="@type"/>&#160;
   <xsl:value-of select="secondclass"/>&#160;
   <xsl:value-of select="firstclass"/>
</xsl:attribute>

, но есть много атрибутов, которые могут быть размещены или нет, и могут расширять класс или нет, так что это будетидеально подходит, чтобы что-то вроде этого

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

для обработки всех их без жесткого кодирования.

Спасибо!

1 Ответ

0 голосов
/ 12 января 2012

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

<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="article">
     <div>
      <xsl:attribute name="class">
        <xsl:apply-templates select="@type | *"/>
      </xsl:attribute>

      <xsl:apply-templates select="text()"/>
     </div>
 </xsl:template>

 <xsl:template match="article/*">
  <xsl:if test="not(position()=1)"><xsl:text> </xsl:text></xsl:if>
  <xsl:value-of select="."/>
 </xsl:template>

 <xsl:template match="article/text()">
  <xsl:value-of select="normalize-space()"/>
 </xsl:template>
</xsl:stylesheet>

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

<article type="funny">
    <firstclass>big</firstclass>
    <secondclass>smooth</secondclass>
    hot-dog 
</article>

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

<div class="funny big smooth">hot-dog</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...