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

如何在XML和XSL中声明名称空间以及更改属性名称?,xml,xslt,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.techn

我有一个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>

测试导入
25000
WS
210
148
4.
24
2015-04-22T12:30:00
2015-04-23T12:30:00
危险品
危险品
真的
C02071
通信
真的
假的
普通的
22500
2500
0
0
A.
4件套
4.
210 x 148
通信
S032132-1
1.
4件套
25000
21015
30
60
12000
2.
2015-04-22T13:00:00
0
我明白了

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

测试导入
25000
WS
210
148
4.
24
2015-04-22T12:30:00
2015-04-23T12:30:00
危险品
危险品
真的
C02071
通信
真的
假的
普通的
22500
2500
0
0
A.
4件套
4.
210 x 148
通信
S032132-1
1.
4件套
25000
21015
30
60
12000
2.
2015-04-22T13:00:00
0
但是,我确实需要“order”元素中的“job_id”属性具有“tg:”前缀。谁能告诉我我做错了什么


谢谢大家

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

<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
元素中声明。

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

<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
元素中声明了。

怎么样:

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

那么:

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


谢谢你的回答,不幸的是它没有解决!它现在显示的属性没有任何名称,只是元素下面的粗体文本!我认为匹配
*
的模板与匹配
节点()的模板具有相同的优先级,因此您可能需要在上面的模板上添加
priority
属性。谢谢,@TimC。。用优先级属性更新了我的答案。我仍然无法让这个解决方案令人烦恼地工作,另一个解决方案对我有效,但我也想尝试解决这个问题!谢谢你的回答,不幸的是它没有解决它!它现在显示的属性没有任何名称,只是元素下面的粗体文本!我认为匹配
*
的模板与匹配
节点()的模板具有相同的优先级,因此您可能需要在上面的模板上添加
priority
属性。谢谢,@TimC。。用优先级属性更新了我的答案。我仍然无法让这个解决方案令人烦恼地工作,另一个解决方案对我有效,但我也想尝试解决这个问题!没有XSLT version=“1.2”。没有XSLT version=“1.2”。