草庐IT

关于 xml:XSLT 显示功绩徽章的问题

codeneng 2023-03-28 原文

XSLT trouble with displaying merit badges

我在尝试显示 1 名侦察员的所有功绩徽章时遇到了麻烦……而且我想不出一个可行的解决方案。例如,我希望它像这样显示(带换行符):

1
2
3
4
First Aid
Swimming
Life saving
...

到目前为止,它只显示每个侦察兵的第一个,即急救

这是 XML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?xml version ="1.0" encoding ="utf-8"?>
<!DOCTYPE bsa SYSTEM"assign08.dtd">
<?xml-stylesheet type="text/xsl" href="assign08.xsl"?>
<bsa>
  <council name ="jedi">
    <troop number ="01" unitname="ok">
  <scout>
    <firstname>John</firstname>
    <lastname>Smith</lastname>
    <phone>111-111-1111</phone>
   
      <street>Fork St.</street>
      <city>Portland</city>
      <state>OR</state>
      </address>
    <rank date-earned ="1/1/01">Eagle</rank>
    <meritbadge date-earned ="1/1/00">First Aid</meritbadge>
    <meritbadge date-earned ="2/1/00">Swimming</meritbadge>
    <meritbadge date-earned ="3/1/00">Life Saving</meritbadge>
    <meritbadge date-earned ="4/1/00">Environmental Science</meritbadge>
    <meritbadge date-earned ="5/1/00">Camping</meritbadge>
    <meritbadge date-earned ="6/1/00">Cooking</meritbadge>
    <meritbadge date-earned ="7/1/00">Safety</meritbadge>
    <meritbadge date-earned ="8/1/00">Basket Weaving</meritbadge>
    <meritbadge date-earned ="9/1/00">Wood carving</meritbadge>
    <meritbadge date-earned ="10/1/00">Archery</meritbadge>
    </scout>
  <scout>
    <firstname>Bill</firstname>
    <lastname>Joel</lastname>
    <phone>111-111-1112</phone>
   
      <street>Fork St.</street>
      <city>Portland</city>
      <state>OR</state>
      </address>
    <rank date-earned ="2/2/02">Eagle</rank>
    <meritbadge date-earned ="1/1/00">First Aid</meritbadge>
    <meritbadge date-earned ="2/1/00">Swimming</meritbadge>
    <meritbadge date-earned ="3/1/00">Life Saving</meritbadge>
    <meritbadge date-earned ="4/1/00">Environmental Science</meritbadge>
    <meritbadge date-earned ="5/1/00">Camping</meritbadge>
    <meritbadge date-earned ="6/1/00">Cooking</meritbadge>
    <meritbadge date-earned ="7/1/00">Safety</meritbadge>
    <meritbadge date-earned ="8/1/00">Basket Weaving</meritbadge>
    <meritbadge date-earned ="9/1/00">Wood carving</meritbadge>
    <meritbadge date-earned ="10/1/00">Archery</meritbadge>
    </scout>

...

这里是 XSL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="UTF-8"?>

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="/">
<html>
<body>
Buy Scouts of America
<table border="1">
 <tr bgcolor="#9acd32">
   <th>Last Name</th>
     <th>First Name</th>
   <th>Phone Number</th>
     <th>Address</th>
     <th>Rank</th>
     <th>Merit Badges</th>
 </tr>
 <xsl:for-each select="bsa/council/troop/scout">
  <xsl:sort select="lastname"/>
 <tr>
   <td><xsl:value-of select="lastname"/></td>
     <td><xsl:value-of select="firstname"/></td>
   <td><xsl:value-of select="phone"/></td>
     <td><xsl:value-of select="address"/></td>
     <td><xsl:value-of select="rank"/></td>
     <td><xsl:value-of select="meritbadge"/></td>
 </tr>
 </xsl:for-each>
  </table>
  </body>
 </html>
</xsl:template>

</xsl:stylesheet>

这是因为您使用的是 XSLT 1.0 和 xsl:value-of。在 1.0 中,xsl:value-of 只会给你第一次出现的值。

尝试使用 <xsl:apply-templates select="meritbadge"/> 代替。如果您需要更改输出的格式,请添加一个与 meritbadge 匹配的模板,并按您喜欢的格式设置。示例:

1
2
3
4
<xsl:template match="meritbadge">
    <xsl:value-of select="."/>
    <br/>
</xsl:template>

另外(不相关)你有"购买美国童子军"而不是"美国童子军"。

EDIT - 修改后的 XSLT 的完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <html>
            <body>
                Buy Scouts of America
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Last Name</th>
                        <th>First Name</th>
                        <th>Phone Number</th>
                        <th>Address</th>
                        <th>Rank</th>
                        <th>Merit Badges</th>
                    </tr>
                    <xsl:for-each select="bsa/council/troop/scout">
                        <xsl:sort select="lastname"/>
                        <tr>
                            <td><xsl:value-of select="lastname"/></td>
                            <td><xsl:value-of select="firstname"/></td>
                            <td><xsl:value-of select="phone"/></td>
                            <td><xsl:value-of select="address"/></td>
                            <td><xsl:value-of select="rank"/></td>
                            <td><xsl:apply-templates select="meritbadge"/></td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="meritbadge">
        <xsl:value-of select="."/>
        <br/>
    </xsl:template>

</xsl:stylesheet>

编辑 #2 - 独立的议会/部队

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">
        <html>
            <body>
                Boy Scouts of America
                <xsl:apply-templates select="council"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="council">
        <xsl:value-of select="@name"/>
        <xsl:apply-templates select="troop"/>
    </xsl:template>

    <xsl:template match="troop">
        <xsl:value-of select="concat(@number,' - ',@unitname)"/>
        <table border="1">
            <tr bgcolor="#9acd32">
                <th>Last Name</th>
                <th>First Name</th>
                <th>Phone Number</th>
                <th>Address</th>
                <th>Rank</th>
                <th>Merit Badges</th>
            </tr>
            <xsl:apply-templates select="scout">
                <xsl:sort select="lastname"/>
            </xsl:apply-templates>
        </table>
    </xsl:template>

    <xsl:template match="scout">
        <tr>
            <td><xsl:apply-templates select="lastname"/></td>
            <td><xsl:apply-templates select="firstname"/></td>
            <td><xsl:apply-templates select="phone"/></td>
            <td><xsl:apply-templates select="address"/></td>
            <td><xsl:apply-templates select="rank"/></td>
            <td><xsl:apply-templates select="meritbadge"/></td>
        </tr>
    </xsl:template>

    <xsl:template match="meritbadge|address/*">
        <xsl:value-of select="."/>
        <br/>
    </xsl:template>

</xsl:stylesheet>

  • @CSStudent - 将模板放在匹配 / 的模板之后。我添加了一个示例模板;如果您需要完整的 XSLT,请告诉我。此外,不要考虑 xsl:for-eachxsl:value-of(拉式方法),而是考虑使用推式方法(xsl:apply-templates 并用其他模板覆盖)。一旦您的 XSLT 变得更大,这将更容易维护。
  • 对不起,我有点迷路了。您介意包含完整的 XSLT 吗?我真的不知道从哪里开始了
  • @CSSStudent - 我添加了您的 XSLT 的修改版本。如果您愿意,我也可以添加一个推送示例。
  • 哦,还有一个问题,我如何将它分成不同的委员会和部队?
  • @CSSStudent - 要将其分成不同的委员会/部队,只需添加模板以匹配这些模板,而不是在匹配 / 的模板中对 bsa/council/troop/scout 执行 xsl:for-each,而是在 council 上执行 xsl:for-each。我添加了另一个示例(但使用 xsl:apply-templates 代替。
  • 我很抱歉。你能否再举一个例子来说明我如何将其划分为一个理事会。我一直在尝试使用模板,但它一直搞砸了。顺便感谢您的帮助。如果我能看到一个议会模板完成,我可能会做一个部队模板
  • @CSStudent - 现在应该有一个例子。我之前贴错了。
  • 哦哦哦好的。哇,非常感谢!我现在明白该怎么做了!
  • @CSStudent - 完全没问题。希望它现在开始有意义。

有关关于 xml:XSLT 显示功绩徽章的问题的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  5. 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代码修改为

  6. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  7. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  8. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  9. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  10. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

随机推荐