как извлечь частичное значение из элемента и назначить атрибутом другого элемента - PullRequest
0 голосов
/ 16 марта 2012

Я работаю над преобразованиями XML в XML с помощью XSLT.

Я хочу извлечь относительное значение из элемента и присвоить его в качестве атрибута новому элементу.

Исходный XML:

      <content>
        <component>
      <aaa>HI
           <strong>[a_b_c]</strong>
              : More Information Needed
            <strong>[d_e_f]</strong>XXX
      </aaa>
     </component>
     <content>

Целевой XML:

    <ddd>hi<dv name='a_b_c'/>: More Information Needed <dv name='d_e_f'/> XXX

    </ddd>

может кто-нибудь подсказать, как это сделать через XSLT.

Заранее спасибо.

1 Ответ

0 голосов
/ 16 марта 2012

XSLT 1.0

<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="aaa">
    <ddd>
      <xsl:value-of select="substring-before(.,'[')"/>
      <dv name="{substring-before(substring-after(.,'['),']')}"/>
    </ddd>
  </xsl:template>

</xsl:stylesheet>

или

XSLT 2.0

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

  <xsl:template match="aaa">
    <ddd>
      <xsl:value-of select="tokenize(.,'\[')[1]"/>
      <dv name="{tokenize(tokenize(.,'\[')[2],'\]')[1]}"/>
    </ddd>
  </xsl:template>

</xsl:stylesheet>

EDIT

<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="aaa">
    <ddd>
      <xsl:apply-templates select="node()|@*"/>
    </ddd>
  </xsl:template>

  <xsl:template match="content|component">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="strong">
    <dv name="{normalize-space(.)}"/>
  </xsl:template>

</xsl:stylesheet>
...