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” <xsl:template match=“/”> </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=“/”> <xsl:template match=“meritbadge”> </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=“/*”> <xsl:template match=“council”> <xsl:template match=“troop”> <xsl:template match=“scout”> <xsl:template match=“meritbadge|address/*”> </xsl:stylesheet> |
- @CSStudent – 将模板放在匹配 / 的模板之后。我添加了一个示例模板;如果您需要完整的 XSLT,请告诉我。此外,不要考虑 xsl:for-each 和 xsl: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 – 完全没问题。希望它现在开始有意义。
来源:https://www.codenong.com/26871536/