如何在XML和XSL中声明名称空间以及更改属性名称?
我有一个XSLT来转换XML文件。此转换声明一个名称空间,将所有元素重命名为具有“tg:”前缀。我的问题是,;我还想重命名特定元素中的特定属性 我现在似乎只能做到这一点或那一点 这是我当前的XSLT文档如何在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
<?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”。