2011-05-31 190 views
0

我遇到了使用xsl将xml转换为xml的问题。我发现问题来自哪里,但仍不知如何解决。用XSLT转换XML问题

<?xml version="1.0" encoding="UTF-8"?> 
<tells uri="" xmlns="http://dl.kr.org/dig/2003/02/lang"> 
    <impliesc> 
    <catom name="name1"/> 
    <catom name="name2"/> 
    </impliesc> 
    <impliesc> 
    <catom name="name3"/> 
    <catom name="name4"/> 
    </impliesc> 
</tells> 

我认为问题来源于此行

<tells uri="" xmlns="http://dl.kr.org/dig/2003/02/lang"> 

如果我删除了 “URI =” “的xmlns =” http://dl.kr.org/dig/2003/02/ lang“”并且只留下

"<tells>" 

一切正常。但是有没有一种方法可以在不删除的情况下进行转换?

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/"> 

    <xsl:element name="tells"> 

     <xsl:for-each select="./tells/impliesc"> 

      <xsl:element name="impliesc"> 

       <xsl:for-each select="./tells/impliesc/catom"> 

        <xsl:element name="catom"> 

         <xsl:attribute name="name"> 
          <xsl:value-of select="./tells/impliesc/individual/@name"/> 
         </xsl:attribute> 

        </xsl:element> 

       </xsl:for-each> 

      </xsl:element> 

     </xsl:for-each> 

    </xsl:element> 

</xsl:template> 

</xsl:stylesheet> 
+0

你能展示一下你的变换吗? – 2011-05-31 17:26:18

+0

您可以发布您的XSLT表格来帮助我们发现问题。 – Kaltezar 2011-05-31 17:26:57

回答

2

你是对的:你的转换不起作用的原因是你在tells元素上有一个名称空间声明。

为了使这个问题消失,您需要让XSLT知道命名空间,并告诉它它试图转换的tells元素属于该命名空间。要做到这一点,最常见的方法是声明在xsl:stylesheet元素的命名空间前缀,然后使用前缀中的XPath,如:

<xsl:stylesheet xmlns:n="http://dl.kr.org/dig/2003/02/lang" ... > 
    ... 
    <xsl:template match="/"> 
     <output> 
     <xsl:apply-templates select="//n:tells"/> 
     </output> 
    </xsl:template> 

    <xsl:template match="n:tells"> 
     ... 
    </xsl:template> 

<xsl:stylesheet> 

在样式表的顶部xmlns:n属性告诉XSLT处理器存在'http://dl.kr.org/dig/2003/02/lang'命名空间,并且前缀n:是它的缩写。在selectmatch属性中,n:前缀告诉XSLT处理器,当它查找名为tells的元素时,它应该在http://dl.kr.org/dig/2003/02/lang名称空间中查找具有该名称的元素。

XML名称空间是XML技术的重要组成部分,人们在学习XML时往往会忽略它们 - 它们很复杂,并且不太直观,并且在您出现时可以忽略它们很长一段时间加快XML。但是,有一点你不能再承受名称空间不存在的简化假设,而你就在那一点上。

+0

谢谢,经过3个小时的搜索,我终于可以使它工作了! – Borzh 2014-10-08 12:37:28

0

在处理名称空间时,您必须在变换中声明它们;否则您将无法正确选择文档节点。

0

没有看到您的XSLT代码,我们无法修复它。尽管如此,xmlns="http://dl.kr.org/dig/2003/02/lang"意味着tells元素及其后代元素位于该名称空间中,因此您的XSLT需要考虑这一点。使用XSLT 1.0时,样式表需要将前缀绑定到名称空间URI,并在XPath表达式和XSLT匹配模式中使用该前缀来限定元素名称,例如

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:df="http://dl.kr.org/dig/2003/02/lang" 
    exclude-result-prefixes="df" 
    version="1.0"> 

    <-- examples --> 
    <xsl:template match="df:tells"> 
    <foo> 
    <xsl:apply-templates/> 
    </foo> 
    </xsl:template> 

    <xsl:template match="df:impliesc"> 
    <bar> 
     <xsl:apply-templates select="df:catom[1]"/> 
    </bar> 
    </xsl:template> 

</xsl:stylesheet>