草庐IT

xml - XSL 根据其他节点的值查找节点 + 多级排序

coder 2024-06-30 原文

基本上我需要弄清楚两件事:

  1. 多级排序
  2. 在我放置 ??? 的第三层:如何选择另一个 <term>其中有 <title>等于 <narrowerterm>当前的 <term> .

我希望这已经足够清楚了。我已经有一段时间找不到我需要的东西了。

我的 XML(摘录):

<thesaurus>
    <term>
        <title>defense</title>
         <narrowerterm>defense skills</narrowerterm>
         <narrowerterm>defense actions</narrowerterm>
    </term>
    <term>
        <title>defense skills</title>
        <broaderterm>defense</broaderterm>
        <narrowerterm>skill cd</narrowerterm>
        <narrowerterm>skill xy</narrowerterm>
        <narrowerterm>skill ab</narrowerterm>
    </term>
    <term>
        <title>defense actions</title>
        <broaderterm>defense</broaderterm>
        <narrowerterm>actions against xy</narrowerterm>
        <narrowerterm>actions against ab</narrowerterm>
    </term>
</thesaurus>

我的 XSL:

<xsl:template match="thesaurus">
<html>
<body> 
<xsl:for-each-group select="term" group-by="title">
    <xsl:sort select="title"/>
    <xsl:choose>
        <xsl:when test="broaderterm"> 
        </xsl:when>
        <xsl:otherwise>
            <xsl:choose>
                <xsl:when test="use"> 
                </xsl:when>
                <xsl:otherwise>
                    <p>
                        <xsl:value-of select="current-grouping-key()"/><br/>
                        <xsl:for-each select="narrowerterm">
                            .<xsl:value-of select="."/><br/>
                            <xsl:for-each select="???"/>
                                ..<xsl:value-of select="narrowerterm"/><br/>
                            </xsl:for-each>
                        </xsl:for-each>
                    </p>
                </xsl:otherwise> 
            </xsl:choose>
        </xsl:otherwise> 
    </xsl:choose>
</xsl:for-each-group> 
</body>
</html>
</xsl:template>

我想要的是:

defense
.defense actions
..actions against ab
..actions against xy
.defense skills
..skill ab
..skill cd
..skill xy

我所在的位置:

defense
.defense skills
.defense actions

最佳答案

我认为这不是分组任务,也不需要 XSLT 2.0。

这个转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="term[not(broaderterm)]">
    <xsl:with-param name="pIndent" select="''"/>
    <xsl:sort select="title"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="term">
  <xsl:param name="pIndent"/>
  <xsl:value-of select="concat($pIndent, title, '&#xA;')"/>

  <xsl:variable name="vSubterms" select=
      "../term[broaderterm = current()/title]"/>

  <xsl:variable name="vLeafSubterms" select=
  "narrowerterm[not(. = /*/term[broaderterm = current()/title]/title)]"/>

  <xsl:apply-templates select="$vSubterms | $vLeafSubterms">
   <xsl:with-param name="pIndent" select="concat($pIndent, '.')"/>
   <xsl:sort select="concat(self::term/title, self::narrowerterm/text())"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="narrowerterm">
  <xsl:param name="pIndent"/>
  <xsl:value-of select="concat($pIndent, ., '&#xA;')"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<thesaurus>
    <term>
        <title>defense</title>
        <narrowerterm>defense skills</narrowerterm>
        <narrowerterm>defense actions</narrowerterm>
    </term>
    <term>
        <title>defense skills</title>
        <broaderterm>defense</broaderterm>
        <narrowerterm>skill cd</narrowerterm>
        <narrowerterm>skill xy</narrowerterm>
        <narrowerterm>skill ab</narrowerterm>
    </term>
    <term>
        <title>defense actions</title>
        <broaderterm>defense</broaderterm>
        <narrowerterm>actions against xy</narrowerterm>
        <narrowerterm>actions against ab</narrowerterm>
    </term>
</thesaurus>

产生想要的、正确的结果:

defense
.defense actions
..actions against ab
..actions against xy
.defense skills
..skill ab
..skill cd
..skill xy

关于xml - XSL 根据其他节点的值查找节点 + 多级排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9602460/

有关xml - XSL 根据其他节点的值查找节点 + 多级排序的更多相关文章

  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 - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  6. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. 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

  9. 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)我

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐