将子元素转换为父元素的属性

时间:2014-12-15 14:54:12

标签: xml xslt transform

我想将JOB_NUMBER字段和ORDERPK字段转换为" order"的属性。节点,有人可以告诉我怎么样?

我有以下XML;

<?xml version="1.0" encoding="UTF-8"?>
<dataroot
    xmlns:od="urn:schemas-microsoft-com:officedata" generated="2014-12-15T14:45:35">
    <order>
        <ORDERPK>2</ORDERPK>
        <JOB_x0020_NUMBER>S019191-9</JOB_x0020_NUMBER>
        <job_description>TESTDATA</job_description>
        <order_qty>1900</order_qty>
        <finishing_style>PB</finishing_style>
        <depth>10</depth>
        <width>8</width>
        <cover_pagination>4</cover_pagination>
        <text_pagination>12</text_pagination>
        <delivery_commence_date>15/12/2014</delivery_commence_date>
        <delivery_complete_date>15/12/2014</delivery_complete_date>
        <job_site>DG</job_site>
        <managing_printer>DG</managing_printer>
        <is_managing_printer>TRUE</is_managing_printer>
        <cust_order_ref>776031</cust_order_ref>
        <cust_code>Test</cust_code>
        <site_cce_name>Jamie</site_cce_name>
        <site_cce_email>JamesBrace@dstoutput.co.uk</site_cce_email>
        <sales_person_name>Jamie Brace</sales_person_name>
        <sales_person_email>JamesBrace@dstouput.co.uk</sales_person_email>
    </order>
</dataroot>

这就是我喜欢的数据;

<order JOB_NUMBER="S019191-9" ORDERPK="2">
<job_description>TESTDATA</job_description>
etc.

到目前为止,我已经提出了XSLT,但是说实话,我根本不熟悉XML或XSLT。

<?xml version="1.0" encoding="UTF‐8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" method="xml" />
  <xsl:template match="/order">
    <root>
      <xsl:apply-templates select="order" />
    </root>
  </xsl:template>

  <xsl:template match="order">
    <order JOB_x0020_NUMBER="{@JOB_x0020_NUMBER}">
      <xsl:value-of select="order" />
    </order>
  </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

你离我不远。从身份模板开始,只将所有内容复制到输出树。然后,为您要为此基本的,不加选择的复制过程定义的所有异常添加更多特定模板。

第一个模板与order匹配,并输出带有两个新属性的新order元素。使用属性值模板检索它们的值。但是,现在表示为属性的两个元素不应出现在输出中。因此,第二个模板与它们匹配,并且什么都不做。

从您的问题中不清楚您是否希望保留order的所有其他子元素,但我认为这是您想要的。

<强>样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:strip-space elements="*"/>

<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="order">
    <order JOB_NUMBER="{JOB_x0020_NUMBER}" ORDERPK="{ORDERPK}">
        <xsl:apply-templates/>  
    </order>
</xsl:template>

<xsl:template match="JOB_x0020_NUMBER | ORDERPK"/>

</xsl:stylesheet>

XML输出

<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2014-12-15T14:45:35">
   <order JOB_NUMBER="S019191-9" ORDERPK="2">
      <job_description>TESTDATA</job_description>
      <order_qty>1900</order_qty>
      <finishing_style>PB</finishing_style>
      <depth>10</depth>
      <width>8</width>
      <cover_pagination>4</cover_pagination>
      <text_pagination>12</text_pagination>
      <delivery_commence_date>15/12/2014</delivery_commence_date>
      <delivery_complete_date>15/12/2014</delivery_complete_date>
      <job_site>DG</job_site>
      <managing_printer>DG</managing_printer>
      <is_managing_printer>TRUE</is_managing_printer>
      <cust_order_ref>776031</cust_order_ref>
      <cust_code>Test</cust_code>
      <site_cce_name>Jamie</site_cce_name>
      <site_cce_email>JamesBrace@dstoutput.co.uk</site_cce_email>
      <sales_person_name>Jamie Brace</sales_person_name>
      <sales_person_email>JamesBrace@dstouput.co.uk</sales_person_email>
   </order>
</dataroot>

顺便说一下,在你的XML中,有一个永远不会使用的命名空间声明:

xmlns:od="urn:schemas-microsoft-com:officedata"

您可能希望将其从结果中排除。如果您可以使用XSLT 2.0,则可以使用copy-namespaces="no"。在XSLT 1.0中,您必须mimic copy-namespaces