XSLT: скопировать атрибуты из дочернего элемента - PullRequest
10 голосов
/ 17 марта 2011

Введите:

 <a q='r'>
   <b x='1' y='2' z='3'/>
   <!-- other a content -->
 </a>

Желаемый вывод:

 <A q='r' x='1' y='2' z='3'>
   <!-- things derived from other a content, no b -->
 </A>

Может ли кто-нибудь любезно дать мне рецепт?

Ответы [ 2 ]

25 голосов
/ 17 марта 2011

Легко.

<xsl:template match="a">
  <A>
    <xsl:copy-of select="@*|b/@*" />
    <xsl:apply-templates /><!-- optional -->
  </A>
</xsl:template>

<xsl:apply-templates /> не требуется, если у вас нет дочерних элементов <a>, которые вы хотите обработать.

Примечание

  • использование <xsl:copy-of> для вставки исходных узлов в выходные данные без изменений
  • использование оператора объединения | для одновременного выбора нескольких несвязанных узлов
  • , которые можно скопировать узлы атрибутовк новому элементу, если это первое, что вы делаете - прежде чем добавлять дочерние элементы.

РЕДАКТИРОВАТЬ: если вам необходимо сузить , какие атрибутывы копируете, и что вы оставляете в покое, используйте это (или его вариант):

<xsl:copy-of select="(@*|b/@*)[
  name() = 'q' or name() = 'x' or name() = 'y' or name() = 'z'
]" />

или даже

<xsl:copy-of select="(@*|b/@*)[
  contains('|q|x|y|z|', concat('|', name(), '|'))
]" />

Обратите внимание, как скобки применяют предикат ко всем сопоставленнымузлы.

6 голосов
/ 17 марта 2011

XSL

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

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

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

    <xsl:template match="b"/>

</xsl:stylesheet>

выход

<A q="r" x="1" y="2" z="3"><!-- other a content --></A>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...