我想将JOB_NUMBER字段和ORDERPK字段转换为“订单”节点的属性,有人可以告诉我如何? 我有以下XML; ?xml version="1.0" encoding="UTF-8"?dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2014-12-15
我有以下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.