草庐IT

xml - XSLT 重命名合格的根元素,保留其他命名空间

coder 2024-06-28 原文

我正在尝试编写一个 XSLT 来在我们需要的地方操作我们的 XML:

我很难让命名空间正常运行。我已经通过许多不同的帖子来解决这个问题,但没有一个完全符合我的情况。

原文:

<?xml version="1.0" encoding="UTF-8"?>
<tool:view name="viewindexes" xmlns="http://company/server/views/index" xmlns:tool="http://company" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <index>
        <index>ABC</index>
        <description>ABC Description</description>
        <atom:link rel="self" href="http://server/admin/views/index/ABC?$format=xml"/>
    </index>
    <index>
        <index>DEF</index>
        <description>DEF Description</description>
        <atom:link rel="self" href="http://server/admin/views/index/DEF?$format=xml"/>
    </index>
    <atom:link rel="self" href="http://server/admin/views/index/DEF?$format=xml&amp;$count=2"/>
    <atom:link rel="next" title="Next interval" href="?$format=xml&amp;$count=2&amp;$start_index=2"/>
</tool:view>

预期:

<?xml version="1.0" encoding="UTF-8"?>
<indexes view="viewindexes" xmlns="http://company/views/index" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <index>
        <index>ABC</index>
        <description>ABC Description</description>
        <atom:link rel="self" href="http://server/admin/views/index/ABC?$format=xml"/>
    </index>
    <index>
        <index>DEF</index>
        <description>DEF Description</description>
        <atom:link rel="self" href="http://server/admin/views/index/DEF?$format=xml"/>
    </index>
    <atom:link rel="self" href="http://server/admin/views/index/DEF?$format=xml&amp;$count=2"/>
    <atom:link rel="next" title="Next interval" href="?$format=xml&amp;$count=2&amp;$start_index=2"/>
</indexes>

XSLT:

 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:variable name="root" select="'indexes'" /> 
        <xsl:variable name="ns" select="'http://company/views/index'" /> 

        <xsl:template match="/*:view">
            <xsl:element name="{$root}" namespace="{$ns}">
                <xsl:attribute name="view">
                    <xsl:value-of select="@name"/>
                </xsl:attribute>
                <xsl:apply-templates />
            </xsl:element>
        </xsl:template>

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

结果:

<?xml version="1.0" encoding="UTF-8"?>
<indexes xmlns="http://company/views/index" view="viewindexes">
        <index xmlns="http://company/server/views/index" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:tool="http://company" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <index>ABC</index>
            <description>ABC Description</description>
            <atom:link href="http://server/admin/views/index/ABC?$format=xml" rel="self"/>
        </index>
        <index xmlns="http://company/server/views/index" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:tool="http://company" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <index>DEF</index>
            <description>DEF Description</description>
            <atom:link href="http://server/admin/views/index/DEF?$format=xml" rel="self"/>
        </index>
        <atom:link xmlns="http://company/server/views/index" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:tool="http://company" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" href="http://server/admin/views/index/DEF?$format=xml&amp;$count=2" rel="self"/>
        <atom:link xmlns="http://company/server/views/index" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:tool="http://company" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" href="?$format=xml&amp;$count=2&amp;$start_index=2" rel="next" title="Next interval"/>
    </indexes>

最佳答案

假设我建议使用 XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://company/views/index"
  xmlns:tool="http://company"
  xmlns:svi="http://company/server/views/index"
  exclude-result-prefixes="tool svi"
>

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

        <xsl:template match="/tool:view">
            <indexes view="{@name}">
                <xsl:copy-of select="namespace::*[not(. = ('http://company', 'http://company/server/views/index'))]"/>
                <xsl:apply-templates />
            </indexes>
        </xsl:template>

        <xsl:template match="svi:*">
          <xsl:element name="{local-name()}">
                <xsl:apply-templates select="@*|node()" />
          </xsl:element>
        </xsl:template>

</xsl:stylesheet>

关于xml - XSLT 重命名合格的根元素,保留其他命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508002/

有关xml - XSLT 重命名合格的根元素,保留其他命名空间的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  5. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  6. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  7. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  10. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

随机推荐