如何在XSLT中正确使用名称空间声明?

时间:2015-01-09 12:16:48

标签: xml xslt

我试图声明一个命名空间,以便我的XML中的所有元素都有一个标记" tg:"在每个元素的名称之前。然而,它似乎没有起作用,我不知道为什么。

这是我的输入XML;

<?xml version="1.0"?>
<orders>
  <dataroot generated="2015-01-09T11:57:36" xmlns:od="urn:schemas-microsoft-com:officedata">
    <order job_id="S026500-1" site_code="DG" replace="true">
    <job_description>TESTING</job_description>
    <order_qty>20000</order_qty>
    <finishing_style>PB</finishing_style>
    <depth>10</depth>
    <width>8</width>
    <cover_pagination>4</cover_pagination>
    <text_pagination>24</text_pagination>
    <delivery_commence_date>19/12/2014</delivery_commence_date>
    <delivery_complete_date>19/12/2014</delivery_complete_date>
    <job_site>DG</job_site>
    <managing_printer>DG</managing_printer>
    <is_managing_printer>True</is_managing_printer>
       <master_version>
          <version_code>COMM</version_code>
          <version_common>true</version_common>
          <version_finished>false</version_finished>
          <version_description>common</version_description>
          <version_nett_qty>20000</version_nett_qty>
          <version_special_qty>0</version_special_qty>
       </master_version>
    </order>
  </dataroot>
</orders>

这就是我喜欢我的输出的样子;

<?xml version="1.0"?>
    <tg:orders>
        <tg:order job_id="S026500-1" site_code="DG" replace="true">
        <tg:job_description>TESTING</job_description>
        <tg:order_qty>20000</order_qty>
        <tg:finishing_style>PB</finishing_style>
        <tg:depth>10</depth>
        <tg:width>8</width>
        <tg:cover_pagination>4</cover_pagination>
        <tg:text_pagination>24</text_pagination>
        <tg:delivery_commence_date>19/12/2014</delivery_commence_date>
        <tg:delivery_complete_date>19/12/2014</delivery_complete_date>
        <tg:job_site>DG</job_site>
        <tg:managing_printer>DG</managing_printer>
        <tg:is_managing_printer>True</is_managing_printer>
           <tg:master_version>
              <tg:version_code>COMM</version_code>
              <tg:version_common>true</version_common>
              <tg:version_finished>false</version_finished>
              <tg:version_description>common</version_description>
              <tg:version_nett_qty>20000</version_nett_qty>
              <tg:version_special_qty>0</version_special_qty>
           </tg:master_version>
        </tg:order>
    </tg:orders>

这是我的XSLT;

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

    <xsl:template match="/*[local-name()='orders']">
        <orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tg="http://www.technique-group.com" xsi:schemaLocation="http://www.technique-group.com/schemas TGScheduleImport_v1.4.xsd" tg:version="1.2">
            <xsl:copy-of select="node()|@*"/>
        </orders>
     </xsl:template>
</xsl:stylesheet>

有人可以向我解释我做错了什么吗?我还想删除dataroot元素,但这可能会在以后发生。

1 个答案:

答案 0 :(得分:2)

使用

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:tg="http://www.technique-group.com"
    version="1.0">

<xsl:template match="*">
  <xsl:element name="tg:{local-name()}" namespace="http://www.technique-group.com">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

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

</xsl:stylesheet>

确保输入中的所有元素都转换为新的命名空间,但dataroot除外,它被剥离。