繁体   English   中英

创建xml元素值以具有相同标签名称的属性

[英]creat xml element value to attribute with same tag name

这是我的简单XML文件:

<products>
    <value>
        <value>
            <region_timezone>
                <value>1</value>
            </region_timezone>
            <registrationstatus>
                <value>2</value>
            </registrationstatus>
            <eventstatus>
                <value>2</value>
            </eventstatus>
            <dist_activity>
                <value>5</value>
                <value>10068</value>
                <value>10070</value>
            </dist_activity>
            <reg_str_dt>
                <value>2013-01-14 20:35:00</value>
            </reg_str_dt>
            <reg_end_dt>
                <value>2013-01-14 20:35:00</value>
            </reg_end_dt>
            <product_id>1</product_id>
            <tab_id>351</tab_id>
            <tab_name>test1</tab_name>
        </value>
    </value>
    <value>
        <value>
            <region_timezone>
                <value>1</value>
            </region_timezone>
            <registrationstatus>
                <value>2</value>
            </registrationstatus>
            <eventstatus>
                <value>2</value>
            </eventstatus>
            <dist_activity>
                <value>5</value>
                <value>10069</value>
                <value>10070</value>
            </dist_activity>
            <reg_str_dt>
                <value>2013-02-14 20:39:00</value>
            </reg_str_dt>
            <reg_end_dt>
                <value>2013-02-14 20:39:00</value>
            </reg_end_dt>
            <product_id>2</product_id>
            <tab_id>352</tab_id>
            <tab_name>test2</tab_name>
        </value>
    </value>
</products>

我尝试这个xslt:

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

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

  <xsl:template match="products/value/value">
    <product_id value="{product_id}">
      <tab_id value="{tab_id}">
        <tab_name value="{tab_name}" />
        <xsl:apply-templates select="node()" />
      </tab_id>
    </product_id>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="self::*[value[not(*)]]"
                           mode="values" />
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="value[not(*)]" />

  <xsl:template match="*" mode="values">
    <xsl:attribute name="value">
      <xsl:apply-templates select="value[not(*)]" mode="values"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="value" mode="values">
    <xsl:value-of select="concat(., ',')"/>
  </xsl:template>

  <xsl:template match="value[last()]" mode="values">
    <xsl:value-of select="."/>
  </xsl:template>

  <xsl:template match="product_id | tab_id | tab_name" />
</xsl:stylesheet>

使用此xslt:-我完成了类似此类型的操作:-

<products>
  <product_id value="1">
    <tab_id value="351">
      <tab_name value="test1" />
      <region_timezone value="1" />
      <registrationstatus value="2" />
      <eventstatus value="2" />
      <dist_activity value="5,10068,10070" />
      <reg_str_dt value="2013-01-14 20:35:00" />
      <reg_end_dt value="2013-01-14 20:35:00" />
    </tab_id>
  </product_id>
  <product_id value="2">
    <tab_id value="352">
      <tab_name value="test2" />
      <region_timezone value="1" />
      <registrationstatus value="2" />
      <eventstatus value="2" />
      <dist_activity value="5,10069,10070" />
      <reg_str_dt value="2013-02-14 20:39:00" />
      <reg_end_dt value="2013-02-14 20:39:00" />
    </tab_id>
  </product_id>
</products>

但是我需要这种类型的o / p:-

<products>
  <product_id value="1">
    <tab_id value="351">
      <tab_name value="test1" />
      <region_timezone value="1" />
      <registrationstatus value="2" />
      <eventstatus value="2" />
      <dist_activity value="5" />
      <dist_activity value="10068" />
      <dist_activity value="10070" />
      <reg_str_dt value="2013-01-14 20:35:00" />
      <reg_end_dt value="2013-01-14 20:35:00" />
    </tab_id>
  </product_id>
  <product_id value="2">
    <tab_id value="352">
      <tab_name value="test2" />
      <region_timezone value="1" />
      <registrationstatus value="2" />
      <eventstatus value="2" />
      <dist_activity value="5" />
      <dist_activity value="10069" />
      <dist_activity value="10070" />
      <reg_str_dt value="2013-02-14 20:39:00" />
      <reg_end_dt value="2013-02-14 20:39:00" />
    </tab_id>
  </product_id>
</products>

在这里,我不需要在当前的o / p中使用逗号分隔(,)。 我想像上面的xml输出一样分隔此元素attiribute值:-

          <dist_activity value="5" />
          <dist_activity value="10069" />
          <dist_activity value="10070" />

请帮助我...
如果它是可能的...
谢谢...

这样做:

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

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

  <xsl:template match="/*/value">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="products/value/value">
    <product_id value="{product_id}">
      <tab_id value="{tab_id}">
        <tab_name value="{tab_name}" />
        <xsl:apply-templates select="node()" />
      </tab_id>
    </product_id>
  </xsl:template>

  <xsl:template match="*[value[not(*)]]">
    <xsl:apply-templates select="value[not(*)]" />
  </xsl:template>

  <xsl:template match="value[not(*)]">
    <xsl:element name="{name(..)}">
      <xsl:attribute name="value">
        <xsl:value-of select="." />
      </xsl:attribute>
      <xsl:apply-templates select="../@* | ../node()[not(self::value[not(*)])]" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="product_id | tab_id | tab_name" />
</xsl:stylesheet>

在样本输入上运行时,将产生:

<products>
  <product_id value="1">
    <tab_id value="351">
      <tab_name value="test1" />
      <region_timezone value="1" />
      <registrationstatus value="2" />
      <eventstatus value="2" />
      <dist_activity value="5" />
      <dist_activity value="10068" />
      <dist_activity value="10070" />
      <reg_str_dt value="2013-01-14 20:35:00" />
      <reg_end_dt value="2013-01-14 20:35:00" />
    </tab_id>
  </product_id>
  <product_id value="2">
    <tab_id value="352">
      <tab_name value="test2" />
      <region_timezone value="1" />
      <registrationstatus value="2" />
      <eventstatus value="2" />
      <dist_activity value="5" />
      <dist_activity value="10069" />
      <dist_activity value="10070" />
      <reg_str_dt value="2013-02-14 20:39:00" />
      <reg_end_dt value="2013-02-14 20:39:00" />
    </tab_id>
  </product_id>
</products>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM