微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想将JOB_NUMBER字段和ORDERPK字段转换为“订单”节点的属性,有人可以告诉我如何?

我有以下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>

解决方法

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

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

从你的问题中不清楚你是否想要保留所有其他子命令的完整性,但我认为这是你想要的.

样式表

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。