2015-09-10 90 views
0

替换XML标签下面我有XML通过XSLT映射

<?xml version="1.0" encoding="UTF-8"?> 
<ConnectInvoice type="INVOICE" xmlns="http://www.scoobydoo.com/xml/ns/ocp"> 
<FileSize id="78447274"> 
<FileHeader> 
    <FileNumber>15043662</FileNumber> 
</FileHeader> 
</FileSize> 
</ConnectInvoice> 

这就需要下面的结构转换为:

<?xml version="1.0" encoding="UTF-8"?> 
<ConnectInvoice type="INVOICE" xmlns="http://www.scoobydoo.com/xml/ns/ocp"> 
<Invoice id="78447274"> 
<FileHeader> 
<FileNumber>15043662</FileNumber> 
</FileHeader> 
</Invoice> 
</ConnectInvoice> 

请注意, “ID” 该值是动态的。

如果xmlns =“http://www.scoobydoo.com/xml/ns/ocp”在XML中不存在,但XSLT在上述xml位于XML中时不执行任何操作,则XSLT映射工作正常。有人可以帮我解决我的XSLT映射

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="FileSize"> 
    <Invoice><xsl:apply-templates select="node()|@*"/></Invoice> 
</xsl:template> 
</xsl:stylesheet> 

非常感谢

更新:

如果我用下面的XSLT。 XML标记文件大小是过得去发票(这是我想要的)替换,但我也得到它(<Invoice id="78447273" xmlns:sd="scoobydoo.com/xml/ns/ocp">)命名空间,我不想

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:sd="scoobydoo.com/xml/ns/ocp"; xmlns:xsl="w3.org/1999/XSL/Transform">; 
<xsl:template match="node()|@*"> 
<xsl:copy> 
<xsl:apply-templates select="node()|@*"/> 
</xsl:copy> 
</xsl:template> 
<xsl:template match="sd:FileSize"> 
<Invoice><xsl:apply-templates select="node()|@*"/></Invoice> 
</xsl:template></xsl:stylesheet> 
+2

尝试在线搜索“XSLT命名空间” - 您引用的xmlns属性声明所有元素都在特定的命名空间中,并且您的XSLT需要反映这一点。 (我不知道确切的语法,所以不要打扰问题;我只是想指出一些问题。) – IMSoP

+0

谢谢。我更新了XSLT:<?xml version =“1.0”encoding =“UTF-8”?> 。现在它在发票后添加命名空间: user2157477

+0

请... _不要发布代码在评论中,_ ***它是不可读的***。如果你对你的问题有更清楚的理解,[更新问题](http://stackoverflow.com/posts/32509696/edit)。 – Abel

回答

0

下面XSLT映射的xmlns是否工作正常= “http://www.scoobydoo.com/xml/ns/ocp”在XML中不存在,但当上述xml位于XML中时,XSLT不执行任何操作。

实际上,XSLT做了很多。您的示例XSLT将处理所有节点并复制所有节点。但是由于没有可用的元素映射,所以没有其他事情会发生。

元素名称由一个名称空间绑定和一个本地部分组成。在你的XSLT中你只给出本地部分。

的xmlns:SD = “scoobydoo.com/xml/ns/ocp”

正如你同时发现,你需要添加的命名空间。

,但我也越来越命名空间,它

是的,因为它现在已经成为结果的一部分。如果处理器遇到命名空间节点,它将添加它们。命名空间修复过程需要处理一些混乱(例如防止重复),但不能做所有事情。

你需要告诉你是(相当)肯定的是,某些命名空间前缀不需要出现在结果中(但如果需要它们时,处理器会增加他们不管),以帮助XSLT处理器:

<xsl:stylesheet version="1.0" 
    xmlns:sd="scoobydoo.com/xml/ns/ocp" 
    xmlns:xsl="w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="sd"> 

(我删除了你的分号,因为这些是不允许的)。

我可以建议快速浏览basics of XML and later XSLT吗?这只会花费你很少的时间(你会惊讶Dimitre可以教你什么,即使只有第一个小时是值得的!),但会为您节省无数小时的挫折。 XML和XSLT是成熟的技术,与其他任何语言一样,掌握它们需要一些时间。一个好的教程或(迷你)课程可以提供帮助。

+0

感谢Abel和Michael的建议。添加排除结果前缀为我工作:) – user2157477

+0

@ user2157477不客气,很高兴我们可以帮助:) – Abel