Извлечь имя тега xml в значение атрибута xml - PullRequest
2 голосов
/ 19 декабря 2011

Файл образца xml показан ниже

<a>
<apple color="red"/>
</a>

Что я должен написать в XSLT, чтобы я мог получить пример вывода ниже?

<AAA>
<BB bbb="#apple"/> <!-- if possible make it auto close -->
</AAA>

Ответы [ 2 ]

2 голосов
/ 19 декабря 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:param name="pReps">
  <e oldName="a" newName="AAA"/>
  <e oldName="apple" newName="BB"/>
  <a oldName="color" newName="bbb"/>
 </xsl:param>

 <xsl:variable name="vReps" select=
     "document('')/*/xsl:param[@name='pReps']"/>

 <xsl:template match="*">
     <xsl:element name=
     "{$vReps/e[@oldName = name(current())]/@newName}">
      <xsl:apply-templates select="@*|node()"/>
     </xsl:element>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:attribute name=
  "{$vReps/a[@oldName = name(current())]/@newName}">
   <xsl:value-of select="concat('#', name(..))"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

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

<a>
    <apple color="red"/>
</a>

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

<AAA>
   <BB bbb="#apple"/>
</AAA>
1 голос
/ 19 декабря 2011

Использование name() или local-name() функций:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/a">
    <AAA>
      <xsl:apply-templates/>
    </AAA>
  </xsl:template>

  <xsl:template match="*">
    <BB bbb="{concat('#', name())}"/>
  </xsl:template>

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