使用XSLT转换XML时出现问题

使用XSLT转换XML时出现问题,xml,xslt,Xml,Xslt,我在使用xsl将xml转换为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"/> </implies

我在使用xsl将xml转换为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>


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

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

如果没有看到您的XSLT代码,我们无法修复它。然而,
xmlns=”http://dl.kr.org/dig/2003/02/lang“
表示
告诉
元素及其子元素在该名称空间中,因此XSLT需要考虑这一点。使用XSLT1.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>

如果没有看到您的XSLT代码,我们无法修复它。然而,
xmlns=”http://dl.kr.org/dig/2003/02/lang“
表示
告诉
元素及其子元素在该名称空间中,因此XSLT需要考虑这一点。使用XSLT1.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>

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

为了解决这个问题,您需要让XSLT知道名称空间,并告诉它
告诉它试图转换的
元素属于该名称空间。最常见的方法是在
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:
前缀是它的缩写。在
select
match
属性中,
n:
前缀告诉XSLT处理器,当它查找名为
的元素时,告诉
它应该查找
中具有该名称的元素http://dl.kr.org/dig/2003/02/lang
名称空间


XML名称空间是XML技术的一个重要组成部分,人们在学习XML时往往会忽略它们——它们很复杂,也不是很直观,当您开始学习XML时,可以忽略它们一段时间。但是,到了一个点,你再也承受不起名称空间不存在的简化假设,你已经到了这个点。

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

为了解决这个问题,您需要让XSLT知道名称空间,并告诉它
告诉它试图转换的
元素属于该名称空间。最常见的方法是在
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:
前缀是它的缩写。在
select
match
属性中,
n:
前缀告诉XSLT处理器,当它查找名为
的元素时,告诉
它应该查找
中具有该名称的元素http://dl.kr.org/dig/2003/02/lang
名称空间


XML名称空间是XML技术的一个重要组成部分,人们在学习XML时往往会忽略它们——它们很复杂,也不是很直观,当您开始学习XML时,可以忽略它们一段时间。但是,到了一个地步,你再也承受不起名称空间不存在这一简化假设,你已经到了这个地步。

你能展示一下你的转换吗?你可以发布你的XSLT表来帮助我们发现问题。你能展示一下你的转换吗?你可以发布你的XSLT表来帮助我们发现问题。在
中,不要忘记XPath中的每个节点都必须带有
n:
前缀。例如:
n:impliesc/n:catom[@name='name1']
。在
中,不要忘记XPath中的每个节点都必须带有
n:
前缀。例如:
n:impliesc/n:catom[@name='name1']