2016-07-28 55 views
0

这里默认的命名空间是我的XML的根(还有更多,但这里是基础):如何添加与XSLT命名空间的属性时,有对XML

<?xml version="1.0" encoding="UTF-8"?><section xmlns="http://quark.com/smartcontent/2.0" id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" type="clientFactsheet"> 

这里是我的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" version="2.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="*|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="section[@id]"> 
     <xsl:copy> 
     <xsl:attribute name="deltaxml:key" select="@id"/> 
      <xsl:apply-templates select="@*, node()"/> 
     </xsl:copy> 
    </xsl:template> 

这里是输出XML根:

<?xml version="1.0" encoding="UTF-8"?><section xmlns="http://quark.com/smartcontent/2.0" id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" type="clientFactsheet"> 

这里是我所得到的,如果我脱下输入XML的默认命名空间(这是理想的结果,但我需要保持默认的命名空间):

<?xml version="1.0" encoding="UTF-8"?><section xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" deltaxml:key="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" type="clientFactsheet"> 

基本上,我需要能够要添加“deltaxml:键”属性与该部分的“id”值,所以为此我需要添加名称空间“deltaxml”,但我还需要保留默认名称空间(可以从文档更改为我赢得的文档没有控制权......所以我不能把它复制过来)。我怎样才能做到这一点?

回答

1

我还需要保持默认命名空间(可从 文件更改记录

这是一种罕见的情况下传入的XML的命名空间是未知提前,这让你在缺点是,由于试图通过其本地名称来匹配/选择节点,可能很容易导致匹配/选择具有相同本地名称但具有不同命名空间的其他节点。沿着这些线路:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="*:section[@id]"> 
    <xsl:copy> 
     <xsl:attribute name="deltaxml:key" select="@id"/> 
     <xsl:apply-templates select="@*, node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

应用于以下输入例如:

XML

<section xmlns="http://quark.com/smartcontent/2.0" 
     id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" 
     type="clientFactsheet"> 
<!-- content --> 
</section> 

结果将是:

<?xml version="1.0" encoding="UTF-8"?> 
<section xmlns="http://quark.com/smartcontent/2.0" 
     xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" 
     deltaxml:key="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" 
     id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" 
     type="clientFactsheet"><!-- content --></section>