我想将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>
答案 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。