使用 XSLT 转换 XML 时出现问题

nyx*_*yxz 1 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"/>
  </impliesc>
  <impliesc>
    <catom name="name3"/>
    <catom name="name4"/>
  </impliesc>
</tells>   
Run Code Online (Sandbox Code Playgroud)

我认为问题来自这一行

<tells uri="" xmlns="http://dl.kr.org/dig/2003/02/lang">
Run Code Online (Sandbox Code Playgroud)

如果我删除“uri =”“xmlns =”http://dl.kr.org/dig/2003/02/lang“”并仅保留

"<tells>" 
Run Code Online (Sandbox Code Playgroud)

一切都很完美。但有没有一种方法可以在不删除它的情况下对其进行改造呢?

<?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>
Run Code Online (Sandbox Code Playgroud)

Rob*_*ney 5

您是对的:您的转换不起作用的原因是您在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>
Run Code Online (Sandbox Code Playgroud)

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

XML 命名空间是 XML 技术的重要组成部分,人们在学习 XML 时常常会忽略它们 - 它们很复杂而且不太直观,当您快速了解 XML 时,您可能会忽略它们很长一段时间。但到了某个时刻,您将无法再接受名称空间不存在的简化假设,而您就到了这个时候。