如何在XML和XSL中声明命名空间以及更改属性名称?

时间:2015-04-21 10:36:34

标签: xml xslt

我有一个XSLT来转换XML文件。此转换声明一个名称空间,以重命名所有元素以具有" tg:"字首。我的问题是这个;我还想重命名特定元素中的特定属性。

我现在似乎只能做一个或另一个。

这是我目前的XSLT文档;

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

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

<xsl:template match="@job_id">
<xsl:attribute name="tg:job_id">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>

<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:stylesheet>

适用于此时;

<?xml version="1.0" encoding="UTF-8"?>
<orders xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:tg="http://www.technique-group.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.technique-group.com/schemas TGScheduleImport_v1.4.xsd" tg:version="1.2">
   <order job_id="S032132COM" site_code="DG" replace="true">
      <job_description>TEST IMPORT</job_description>
      <order_qty>25000</order_qty>
      <finishing_style>WS</finishing_style>
      <depth>210</depth>
      <width>148</width>
      <cover_pagination>4</cover_pagination>
      <text_pagination>24</text_pagination>
      <delivery_commence_date>2015-04-22T12:30:00</delivery_commence_date>
      <delivery_complete_date>2015-04-23T12:30:00</delivery_complete_date>
      <job_site>DG</job_site>
      <managing_printer>DG</managing_printer>
      <is_managing_printer>true</is_managing_printer>
      <cust_code>C02071</cust_code>
      <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>22500</version_nett_qty>
         <version_special_qty>2500</version_special_qty>
      </master_version>
      <press_section>
         <signature_id>0</signature_id>
         <sequence_id>0</sequence_id>
         <sequence_alpha>A</sequence_alpha>
         <description>4pp Cover</description>
         <pagination>4</pagination>
         <trim_size>210 x 148</trim_size>
         <version>
            <version_code>COMM</version_code>
            <task_info confirmed="true" maintenance="false" provisional="false">
               <task_sub_job_id>S032132-1</task_sub_job_id>
               <task_seq_id>1</task_seq_id>
               <task_description>4pp Cover</task_description>
               <task_qty_rqd>25000</task_qty_rqd>
               <task_resource_id>21015</task_resource_id>
               <task_mr_mins>30</task_mr_mins>
               <task_run_mins>60</task_run_mins>
               <task_run_speed>12000</task_run_speed>
               <task_no_up>2</task_no_up>
               <task_deadline_date_time>2015-04-22T13:00:00</task_deadline_date_time>
               <task_pdt>0.0</task_pdt>
            </task_info>
         </version>
      </press_section>
   </order>
</orders>

我明白了;

<?xml version="1.0" encoding="UTF-8"?>
<tg:orders xmlns:tg="http://www.technique-group.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.technique-group.com/schemas TGScheduleImport_v1.4.xsd" tg:version="1.2">
   <tg:order job_id="S032132COM" site_code="DG" replace="true">
      <tg:job_description>TEST IMPORT</tg:job_description>
      <tg:order_qty>25000</tg:order_qty>
      <tg:finishing_style>WS</tg:finishing_style>
      <tg:depth>210</tg:depth>
      <tg:width>148</tg:width>
      <tg:cover_pagination>4</tg:cover_pagination>
      <tg:text_pagination>24</tg:text_pagination>
      <tg:delivery_commence_date>2015-04-22T12:30:00</tg:delivery_commence_date>
      <tg:delivery_complete_date>2015-04-23T12:30:00</tg:delivery_complete_date>
      <tg:job_site>DG</tg:job_site>
      <tg:managing_printer>DG</tg:managing_printer>
      <tg:is_managing_printer>true</tg:is_managing_printer>
      <tg:cust_code>C02071</tg:cust_code>
      <tg:master_version>
         <tg:version_code>COMM</tg:version_code>
         <tg:version_common>true</tg:version_common>
         <tg:version_finished>false</tg:version_finished>
         <tg:version_description>Common</tg:version_description>
         <tg:version_nett_qty>22500</tg:version_nett_qty>
         <tg:version_special_qty>2500</tg:version_special_qty>
      </tg:master_version>
      <tg:press_section>
         <tg:signature_id>0</tg:signature_id>
         <tg:sequence_id>0</tg:sequence_id>
         <tg:sequence_alpha>A</tg:sequence_alpha>
         <tg:description>4pp Cover</tg:description>
         <tg:pagination>4</tg:pagination>
         <tg:trim_size>210 x 148</tg:trim_size>
         <tg:version>
            <tg:version_code>COMM</tg:version_code>
            <tg:task_info confirmed="true" maintenance="false" provisional="false">
               <tg:task_sub_job_id>S032132-1</tg:task_sub_job_id>
               <tg:task_seq_id>1</tg:task_seq_id>
               <tg:task_description>4pp Cover</tg:task_description>
               <tg:task_qty_rqd>25000</tg:task_qty_rqd>
               <tg:task_resource_id>21015</tg:task_resource_id>
               <tg:task_mr_mins>30</tg:task_mr_mins>
               <tg:task_run_mins>60</tg:task_run_mins>
               <tg:task_run_speed>12000</tg:task_run_speed>
               <tg:task_no_up>2</tg:task_no_up>
               <tg:task_deadline_date_time>2015-04-22T13:00:00</tg:task_deadline_date_time>
               <tg:task_pdt>0.0</tg:task_pdt>
            </tg:task_info>
         </tg:version>
      </tg:press_section>
   </tg:order>
</tg:orders>

但是我真的需要&#34; job_id&#34;属性在&#34;顺序&#34;元素有&#34; tg:&#34;字首。谁能告诉我我做错了什么?

全部谢谢!

2 个答案:

答案 0 :(得分:2)

更改最后一个模板,不是复制属性,而是处理它们:

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

此外,我不认为此处需要namespace属性,因为tg前缀的命名空间已在xsl:stylesheet元素处声明。

答案 1 :(得分:2)

怎么样:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tg="http://www.technique-group.com">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- move elements to new namespace -->
<xsl:template match="*">
    <xsl:element name="tg:{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

<!-- copy attributes -->
<xsl:template match="@*">
    <xsl:copy-of select="."/>
</xsl:template>

<!-- exception -->
<xsl:template match="order/@job_id">
    <xsl:attribute name="tg:job_id">
        <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>

</xsl:stylesheet>