如何从元素中提取部分值并将其作为属性指定给另一个元素

时间:2012-03-16 06:45:49

标签: xml xslt xslt-grouping

我正在通过XSLT进行XML到XML的转换。

我想从元素中提取aprtial值,并将其作为属性赋值给新元素。

源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 :(得分:0)

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>

修改

<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>