使用 XSLT 设置嵌套 XML 元素的样式?
Styling a nested XML element with XSLT?
我是一名平面设计师,负责制作旅行指南,我们最近开始使用 XML 标记的内容和 XSLT 样式进行管理。除了这个让我们束手无策的小问题外,它大部分都有效!我们有一些应该显示为“子”列表的子景点列表,我们可以在 InDesign 布局中设置不同的样式,并且通过在 MainAttraction 标签中注明其“父”景点的值来在 XML 中注明它们.
我的理解是,我们需要 .XSL 来注意 MainAttraction 标签中是否有值,如果有,则将与该景点关联的元素提取到不同的容器标签下,这样我们就可以风格不同。在进行了一些基本培训并在论坛上进行谷歌搜索后,我只是没有运气为此编写有效的语法。
这是我正在试验的,除了子景点(它们列在相关父列表的景点标签中)外,它正确地引入了所有内容:
XSLT
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<Cities>
<xsl:for-each select="Root/City">
<City>
<City_Name>
<xsl:value-of select="City_Name"/>
</City_Name>
<xsl:text>
</xsl:text>
<City_Stats>
<xsl:text>POP. </xsl:text>
<xsl:value-of select="Population"/>
<xsl:text> ALT. </xsl:text>
<xsl:value-of select="Altitude"/>
<xsl:text> MAP </xsl:text>
<xsl:value-of select="Map_Grid_Location"/>
</City_Stats>
<xsl:text>
</xsl:text>
<Visitor_Info>
<Visitor_Center>
<xsl:value-of select="Visitor_Center"/><xsl:text>: </xsl:text>
</Visitor_Center>
<Visitor_Information>
<xsl:value-of select="Visitor_Information"/><xsl:text> </xsl:text>
<xsl:value-of select="Address"/>
<xsl:text> </xsl:text>
<xsl:value-of select="normalize-space(Phone1)"/>
<xsl:if test="string-length(Phone2) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="Phone2"/>
</xsl:if>
<xsl:if test="string-length(Phone1) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Website1)"/>
<xsl:if test="string-length(Website2) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="Website2"/>
</xsl:if>
<xsl:if test="string-length(Website1) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
</Visitor_Information>
</Visitor_Info>
<xsl:text>
</xsl:text>
<Description>
<xsl:value-of select="Description"/>
</Description>
<xsl:text>
</xsl:text>
<Attractions>
<xsl:apply-templates select="Attraction"/>
</Attractions>
</City>
</xsl:for-each>
</Cities>
</xsl:template>
<xsl:template match="Attraction">
<Attraction>
<Attraction_Title>
<xsl:value-of select="normalize-space(Attraction_Title)"/>
</Attraction_Title>
<xsl:text>—</xsl:text>
<xsl:value-of select="Desc"/><xsl:text> </xsl:text>
<xsl:value-of select="normalize-space(Admissions)"/>
<xsl:if test="string-length(Admissions) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Address)"/>
<xsl:if test="string-length(Address) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Directions)"/>
<xsl:if test="string-length(Directions) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Phone)"/>
<xsl:if test="string-length(AltPhone) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="normalize-space(AltPhone)"/>
</xsl:if>
<xsl:if test="string-length(Phone) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(WebAddress)"/>
<xsl:if test="string-length(WebAddress2) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="normalize-space(WebAddress2)"/>
</xsl:if>
<xsl:if test="string-length(WebAddress) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Email)"/>
<xsl:if test="string-length(Email) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="string-length(SeeAlso) > 0">
<xsl:text> </xsl:text>
<xsl:text>See </xsl:text>
<xsl:value-of select="normalize-space(SeeAlso)"/>
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:text>
</xsl:text>
</Attraction>
</xsl:template>
<xsl:template match="SubAttraction">
<SubAttraction>
<xsl:if test="string-length(MainAttraction) > 0">
<xsl:text>	</xsl:text>
<SubAttraction_Title>
<xsl:value-of select="normalize-space(Attraction_Title)"/>
</SubAttraction_Title>
<xsl:text>—</xsl:text>
<xsl:value-of select="Desc"/><xsl:text> </xsl:text>
<xsl:value-of select="normalize-space(Admissions)"/>
<xsl:if test="string-length(Admissions) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Address)"/>
<xsl:if test="string-length(Address) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Directions)"/>
<xsl:if test="string-length(Directions) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Phone)"/>
<xsl:if test="string-length(AltPhone) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="normalize-space(AltPhone)"/>
</xsl:if>
<xsl:if test="string-length(Phone) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(WebAddress)"/>
<xsl:if test="string-length(WebAddress2) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="normalize-space(WebAddress2)"/>
</xsl:if>
<xsl:if test="string-length(WebAddress) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Email)"/>
<xsl:if test="string-length(Email) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:text>
</xsl:text>
</xsl:if>
</SubAttraction>
</xsl:template>
</xsl:stylesheet>
XML INPUT SAMPLE(请注意,子景点示例 Fredda Turner Durham 儿童博物馆在其 Main Attraction 标签中有一个值并嵌套在其父列表的吸引力标签)
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<City>
<City_Name>MIDLAND</City_Name>
<Region>BIG BEND COUNTRY</Region>
<Population>127,598</Population>
<Altitude>2,891</Altitude>
<Map_Grid_Location>L-9/KK-4</Map_Grid_Location>
<Visitor_Center>Midland Visitors Center</Visitor_Center> <Visitor_Information>Midland Convention & Visitors Bureau: Open 8 a.m.-5 p.m. Mon.-Sat. 109 N Main St. 800/624-6435.</Visitor_Information><Address>1406 W. I-20 (Exit 136).</Address><Hours>Open 9 a.m.-5 p.m. Mon.-Sat.</Hours><Phone1>432/683-2882</Phone1><Phone2>800/624-6435</Phone2><Website1><a href="http://www.visitmidlandtexas.com" >www.visitmidlandtexas.com</a></Website1><Website2></Website2><Email></Email>
<CityId>MIDLAND</CityId>
<Description>Description text goes here.</Description>
<Attraction>
<Attraction_Title>Haley Library & History Center</Attraction_Title>
<Desc>Description text goes here. </Desc>
<Admissions>Donations accepted.</Admissions>
<Hours>Open 9 a.m.-5 p.m. Mon.-Fri.</Hours>
<Address>1805 W. Indiana Ave.</Address>
<Directions></Directions>
<Phone>432/682-5785</Phone>
<AltPhone></AltPhone>
<WebAddress></WebAddress>
<WebAddress2></WebAddress2>
<Email></Email>
<SeeAlso></SeeAlso>
<MainAttraction></MainAttraction>
</Attraction>
<Attraction>
<Attraction_Title>I-20 Wildlife Preserve & Jenna Welch Nature Study Center</Attraction_Title>
<Desc>Description text goes here.</Desc>
<Admissions></Admissions>
<Hours>Open dusk–dawn daily.</Hours>
<Address>2201 S. Midland Dr.</Address>
<Phone>432/853-9453</Phone>
<AltPhone></AltPhone>
<WebAddress>www.i20wildlifepreserve.org</WebAddress>
<WebAddress2></WebAddress2>
<Email></Email>
<SeeAlso></SeeAlso>
<MainAttraction></MainAttraction>
</Attraction>
<Attraction>
<Attraction_Title>Museum of the Southwest</Attraction_Title>
<Desc>Description text goes here.</Desc>
<Admissions>Admission charged.</Admissions>
<Hours>Open 10 a.m.-5 p.m. Tue.-Sat. and 2-5 p.m. Sun.</Hours>
<Address>1705 W. Missouri.</Address>
<Directions></Directions>
<Phone>432/683-2882</Phone>
<AltPhone></AltPhone>
<WebAddress>www.museumsw.org</WebAddress>
<WebAddress2></WebAddress2>
<Email></Email>
<SeeAlso></SeeAlso>
<MainAttraction></MainAttraction>
<Attraction>
<Attraction_Title>Fredda Turner Durham Children's Museum</Attraction_Title>
<Desc>Description text goes here.</Desc>
<Admissions>Admission charge.</Admissions>
<Hours>Open 10 a.m.-5 p.m. Tue.-Sat. and 2-5 p.m. Sun. Free admission on Sundays.</Hours>
<Address></Address><Directions></Directions><Phone>432/683-2882</Phone><AltPhone></AltPhone><WebAddress></WebAddress><WebAddress2></WebAddress2><Email></Email><SeeAlso></SeeAlso><MainAttraction>Museum of the Southwest</MainAttraction>
</Attraction>
</Attraction>
</City>
</Root>
CURRENT OUTPUT(子景点不显示)
<?xml version="1.0" encoding="UTF-8"?>
<Cities>
<City>
<City_Name>MIDLAND</City_Name>
<City_Stats>POP. 127,598 ALT. 2,891 MAP L-9/KK-4</City_Stats>
<Visitor_Info>
<Visitor_Center>Midland Visitors Center:</Visitor_Center>
<Visitor_Information>Midland Convention & Visitors Bureau: Open 8 a.m.-5 p.m. Mon.-Sat. 109 N Main St. 800/624-6435. 1406 W. I-20 (Exit 136). 432/683-2882 or 800/624-6435. <a href="http://www.visitmidlandtexas.com" >www.visitmidlandtexas.com</a>.</Visitor_Information>
</Visitor_Info>
<Description>Description text goes here.</Description>
<Attractions>
<Attraction>
<Attraction_Title>Haley Library & History Center</Attraction_Title>
—Description text goes here. Donations accepted.. 1805 W. Indiana Ave.. 432/682-5785.
</Attraction>
<Attraction>
<Attraction_Title>I-20 Wildlife Preserve & Jenna Welch Nature Study Center</Attraction_Title>
—Description text goes here. 2201 S. Midland Dr.. 432/853-9453. www.i20wildlifepreserve.org.
</Attraction>
<Attraction>
<Attraction_Title>Museum of the Southwest</Attraction_Title>
—Description text goes here. Admission charged.. 1705 W. Missouri.. 432/683-2882. www.museumsw.org.
</Attraction>
</Attractions>
</City>
</Cities>
DESIRED OUTPUT(子景点显示并有自己的容器标签)
<?xml version="1.0" encoding="UTF-8"?>
<Cities>
<City>
<City_Name>MIDLAND</City_Name>
<City_Stats>POP. 127,598 ALT. 2,891 MAP L-9/KK-4</City_Stats>
<Visitor_Info>
<Visitor_Center>Midland Visitors Center:</Visitor_Center>
<Visitor_Information>Midland Convention & Visitors Bureau: Open 8 a.m.-5 p.m. Mon.-Sat. 109 N Main St. 800/624-6435. 1406 W. I-20 (Exit 136). 432/683-2882 or 800/624-6435. <a href="http://www.visitmidlandtexas.com" >www.visitmidlandtexas.com</a>.</Visitor_Information>
</Visitor_Info>
<Description>Description text goes here.</Description>
<Attractions>
<Attraction>
<Attraction_Title>Haley Library & History Center</Attraction_Title>
—Description text goes here. Donations accepted.. 1805 W. Indiana Ave.. 432/682-5785.
</Attraction>
<Attraction>
<Attraction_Title>I-20 Wildlife Preserve & Jenna Welch Nature Study Center</Attraction_Title>—Description text goes here. 2201 S. Midland Dr.. 432/853-9453. www.i20wildlifepreserve.org.
</Attraction>
<Attraction>
<Attraction_Title>Museum of the Southwest</Attraction_Title>—Description text goes here. Admission charged.. 1705 W. Missouri.. 432/683-2882. www.museumsw.org.
</Attraction>
<SubAttraction>
<SubAttraction_Title>Fredda Turner Durham Children's Museum</SubAttraction_Title>—Description text goes here. Admission charge.. 432/683-2882.
</SubAttraction>
</Attractions>
</City>
</Cities>
那么我要在这里做什么才能使子景点(在 MainAttraction 字段中具有值的景点)可以被拉入新的容器标签?我知道我们想为 SubAttractions 创建一个新模板,但我不知道如何只将所需的元素放入其中。如果对于更有经验的人来说不是太困难的话,我将非常感谢帮助找到可以插入的东西。
[原始 post 已被编辑以提供更多有用的信息。]
So what do I do here to make it so attractions with a MainAttraction
value get displayed, tagged and styled differently?
这取决于样式的不同程度。如果它 非常 不同,您可能希望使用不同的模板来处理每种类型,例如:
<xsl:template match="Attraction">
<!-- code to process "regular" attraction -->
</xsl:template>
<xsl:template match="Attraction[string(MainAttraction)]">
<!-- code to process "main" attraction -->
</xsl:template>
否则,您可以使用 xsl:choose
and/or xsl:if
在同一模板中的两种类型之间进行分支。
编辑:
我在处理这两种类型的方式中看到的唯一区别是包含元素的名称:Attraction
或 SubAttraction
。
如果这个观察是正确的,我建议你尝试这种方式(最小化到只有问题的必要部分):
XSLT 1.0
<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:strip-space elements="*"/>
<xsl:template match="/Root">
<Cities>
<xsl:apply-templates select="City"/>
</Cities>
</xsl:template>
<xsl:template match="City">
<City>
<City_Name>
<xsl:value-of select="City_Name"/>
</City_Name>
<!-- more details here -->
<Attractions>
<xsl:apply-templates select="Attraction"/>
</Attractions>
</City>
</xsl:template>
<xsl:template match="Attraction">
<xsl:variable name="tag">
<xsl:choose>
<xsl:when test="string(MainAttraction)">SubAttraction</xsl:when>
<xsl:otherwise>Attraction</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$tag}">
<Attraction_Title>
<xsl:value-of select="normalize-space(Attraction_Title)"/>
</Attraction_Title>
<xsl:value-of select="Desc"/>
<!-- more details here -->
</xsl:element>
<xsl:apply-templates select="Attraction"/>
</xsl:template>
</xsl:stylesheet>
请注意,与您原来的问题不同,您现在将子景点显示为主要景点的子景点。这需要另一个 xsl:apply-templates select="Attraction"
从主要景点的上下文调用(如上所示)。
行
<xsl:template match="SubAttraction">
不会匹配任何内容,因为输入中没有 SubAttraction 节点 xml。
要获得匹配,您需要将其更改为
<xsl:template match="Attraction[../../Attraction]">
然后添加
<xsl:apply-templates select="Attraction"/>
行前
</Attraction>
在您的 xsl:template 匹配="Attraction" 模板中。
我是一名平面设计师,负责制作旅行指南,我们最近开始使用 XML 标记的内容和 XSLT 样式进行管理。除了这个让我们束手无策的小问题外,它大部分都有效!我们有一些应该显示为“子”列表的子景点列表,我们可以在 InDesign 布局中设置不同的样式,并且通过在 MainAttraction 标签中注明其“父”景点的值来在 XML 中注明它们.
我的理解是,我们需要 .XSL 来注意 MainAttraction 标签中是否有值,如果有,则将与该景点关联的元素提取到不同的容器标签下,这样我们就可以风格不同。在进行了一些基本培训并在论坛上进行谷歌搜索后,我只是没有运气为此编写有效的语法。
这是我正在试验的,除了子景点(它们列在相关父列表的景点标签中)外,它正确地引入了所有内容:
XSLT
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<Cities>
<xsl:for-each select="Root/City">
<City>
<City_Name>
<xsl:value-of select="City_Name"/>
</City_Name>
<xsl:text>
</xsl:text>
<City_Stats>
<xsl:text>POP. </xsl:text>
<xsl:value-of select="Population"/>
<xsl:text> ALT. </xsl:text>
<xsl:value-of select="Altitude"/>
<xsl:text> MAP </xsl:text>
<xsl:value-of select="Map_Grid_Location"/>
</City_Stats>
<xsl:text>
</xsl:text>
<Visitor_Info>
<Visitor_Center>
<xsl:value-of select="Visitor_Center"/><xsl:text>: </xsl:text>
</Visitor_Center>
<Visitor_Information>
<xsl:value-of select="Visitor_Information"/><xsl:text> </xsl:text>
<xsl:value-of select="Address"/>
<xsl:text> </xsl:text>
<xsl:value-of select="normalize-space(Phone1)"/>
<xsl:if test="string-length(Phone2) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="Phone2"/>
</xsl:if>
<xsl:if test="string-length(Phone1) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Website1)"/>
<xsl:if test="string-length(Website2) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="Website2"/>
</xsl:if>
<xsl:if test="string-length(Website1) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
</Visitor_Information>
</Visitor_Info>
<xsl:text>
</xsl:text>
<Description>
<xsl:value-of select="Description"/>
</Description>
<xsl:text>
</xsl:text>
<Attractions>
<xsl:apply-templates select="Attraction"/>
</Attractions>
</City>
</xsl:for-each>
</Cities>
</xsl:template>
<xsl:template match="Attraction">
<Attraction>
<Attraction_Title>
<xsl:value-of select="normalize-space(Attraction_Title)"/>
</Attraction_Title>
<xsl:text>—</xsl:text>
<xsl:value-of select="Desc"/><xsl:text> </xsl:text>
<xsl:value-of select="normalize-space(Admissions)"/>
<xsl:if test="string-length(Admissions) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Address)"/>
<xsl:if test="string-length(Address) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Directions)"/>
<xsl:if test="string-length(Directions) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Phone)"/>
<xsl:if test="string-length(AltPhone) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="normalize-space(AltPhone)"/>
</xsl:if>
<xsl:if test="string-length(Phone) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(WebAddress)"/>
<xsl:if test="string-length(WebAddress2) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="normalize-space(WebAddress2)"/>
</xsl:if>
<xsl:if test="string-length(WebAddress) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Email)"/>
<xsl:if test="string-length(Email) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="string-length(SeeAlso) > 0">
<xsl:text> </xsl:text>
<xsl:text>See </xsl:text>
<xsl:value-of select="normalize-space(SeeAlso)"/>
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:text>
</xsl:text>
</Attraction>
</xsl:template>
<xsl:template match="SubAttraction">
<SubAttraction>
<xsl:if test="string-length(MainAttraction) > 0">
<xsl:text>	</xsl:text>
<SubAttraction_Title>
<xsl:value-of select="normalize-space(Attraction_Title)"/>
</SubAttraction_Title>
<xsl:text>—</xsl:text>
<xsl:value-of select="Desc"/><xsl:text> </xsl:text>
<xsl:value-of select="normalize-space(Admissions)"/>
<xsl:if test="string-length(Admissions) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Address)"/>
<xsl:if test="string-length(Address) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Directions)"/>
<xsl:if test="string-length(Directions) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Phone)"/>
<xsl:if test="string-length(AltPhone) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="normalize-space(AltPhone)"/>
</xsl:if>
<xsl:if test="string-length(Phone) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(WebAddress)"/>
<xsl:if test="string-length(WebAddress2) > 0">
<xsl:text> or </xsl:text>
<xsl:value-of select="normalize-space(WebAddress2)"/>
</xsl:if>
<xsl:if test="string-length(WebAddress) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(Email)"/>
<xsl:if test="string-length(Email) > 0">
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:text>
</xsl:text>
</xsl:if>
</SubAttraction>
</xsl:template>
</xsl:stylesheet>
XML INPUT SAMPLE(请注意,子景点示例 Fredda Turner Durham 儿童博物馆在其 Main Attraction 标签中有一个值并嵌套在其父列表的吸引力标签)
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<City>
<City_Name>MIDLAND</City_Name>
<Region>BIG BEND COUNTRY</Region>
<Population>127,598</Population>
<Altitude>2,891</Altitude>
<Map_Grid_Location>L-9/KK-4</Map_Grid_Location>
<Visitor_Center>Midland Visitors Center</Visitor_Center> <Visitor_Information>Midland Convention & Visitors Bureau: Open 8 a.m.-5 p.m. Mon.-Sat. 109 N Main St. 800/624-6435.</Visitor_Information><Address>1406 W. I-20 (Exit 136).</Address><Hours>Open 9 a.m.-5 p.m. Mon.-Sat.</Hours><Phone1>432/683-2882</Phone1><Phone2>800/624-6435</Phone2><Website1><a href="http://www.visitmidlandtexas.com" >www.visitmidlandtexas.com</a></Website1><Website2></Website2><Email></Email>
<CityId>MIDLAND</CityId>
<Description>Description text goes here.</Description>
<Attraction>
<Attraction_Title>Haley Library & History Center</Attraction_Title>
<Desc>Description text goes here. </Desc>
<Admissions>Donations accepted.</Admissions>
<Hours>Open 9 a.m.-5 p.m. Mon.-Fri.</Hours>
<Address>1805 W. Indiana Ave.</Address>
<Directions></Directions>
<Phone>432/682-5785</Phone>
<AltPhone></AltPhone>
<WebAddress></WebAddress>
<WebAddress2></WebAddress2>
<Email></Email>
<SeeAlso></SeeAlso>
<MainAttraction></MainAttraction>
</Attraction>
<Attraction>
<Attraction_Title>I-20 Wildlife Preserve & Jenna Welch Nature Study Center</Attraction_Title>
<Desc>Description text goes here.</Desc>
<Admissions></Admissions>
<Hours>Open dusk–dawn daily.</Hours>
<Address>2201 S. Midland Dr.</Address>
<Phone>432/853-9453</Phone>
<AltPhone></AltPhone>
<WebAddress>www.i20wildlifepreserve.org</WebAddress>
<WebAddress2></WebAddress2>
<Email></Email>
<SeeAlso></SeeAlso>
<MainAttraction></MainAttraction>
</Attraction>
<Attraction>
<Attraction_Title>Museum of the Southwest</Attraction_Title>
<Desc>Description text goes here.</Desc>
<Admissions>Admission charged.</Admissions>
<Hours>Open 10 a.m.-5 p.m. Tue.-Sat. and 2-5 p.m. Sun.</Hours>
<Address>1705 W. Missouri.</Address>
<Directions></Directions>
<Phone>432/683-2882</Phone>
<AltPhone></AltPhone>
<WebAddress>www.museumsw.org</WebAddress>
<WebAddress2></WebAddress2>
<Email></Email>
<SeeAlso></SeeAlso>
<MainAttraction></MainAttraction>
<Attraction>
<Attraction_Title>Fredda Turner Durham Children's Museum</Attraction_Title>
<Desc>Description text goes here.</Desc>
<Admissions>Admission charge.</Admissions>
<Hours>Open 10 a.m.-5 p.m. Tue.-Sat. and 2-5 p.m. Sun. Free admission on Sundays.</Hours>
<Address></Address><Directions></Directions><Phone>432/683-2882</Phone><AltPhone></AltPhone><WebAddress></WebAddress><WebAddress2></WebAddress2><Email></Email><SeeAlso></SeeAlso><MainAttraction>Museum of the Southwest</MainAttraction>
</Attraction>
</Attraction>
</City>
</Root>
CURRENT OUTPUT(子景点不显示)
<?xml version="1.0" encoding="UTF-8"?>
<Cities>
<City>
<City_Name>MIDLAND</City_Name>
<City_Stats>POP. 127,598 ALT. 2,891 MAP L-9/KK-4</City_Stats>
<Visitor_Info>
<Visitor_Center>Midland Visitors Center:</Visitor_Center>
<Visitor_Information>Midland Convention & Visitors Bureau: Open 8 a.m.-5 p.m. Mon.-Sat. 109 N Main St. 800/624-6435. 1406 W. I-20 (Exit 136). 432/683-2882 or 800/624-6435. <a href="http://www.visitmidlandtexas.com" >www.visitmidlandtexas.com</a>.</Visitor_Information>
</Visitor_Info>
<Description>Description text goes here.</Description>
<Attractions>
<Attraction>
<Attraction_Title>Haley Library & History Center</Attraction_Title>
—Description text goes here. Donations accepted.. 1805 W. Indiana Ave.. 432/682-5785.
</Attraction>
<Attraction>
<Attraction_Title>I-20 Wildlife Preserve & Jenna Welch Nature Study Center</Attraction_Title>
—Description text goes here. 2201 S. Midland Dr.. 432/853-9453. www.i20wildlifepreserve.org.
</Attraction>
<Attraction>
<Attraction_Title>Museum of the Southwest</Attraction_Title>
—Description text goes here. Admission charged.. 1705 W. Missouri.. 432/683-2882. www.museumsw.org.
</Attraction>
</Attractions>
</City>
</Cities>
DESIRED OUTPUT(子景点显示并有自己的容器标签)
<?xml version="1.0" encoding="UTF-8"?>
<Cities>
<City>
<City_Name>MIDLAND</City_Name>
<City_Stats>POP. 127,598 ALT. 2,891 MAP L-9/KK-4</City_Stats>
<Visitor_Info>
<Visitor_Center>Midland Visitors Center:</Visitor_Center>
<Visitor_Information>Midland Convention & Visitors Bureau: Open 8 a.m.-5 p.m. Mon.-Sat. 109 N Main St. 800/624-6435. 1406 W. I-20 (Exit 136). 432/683-2882 or 800/624-6435. <a href="http://www.visitmidlandtexas.com" >www.visitmidlandtexas.com</a>.</Visitor_Information>
</Visitor_Info>
<Description>Description text goes here.</Description>
<Attractions>
<Attraction>
<Attraction_Title>Haley Library & History Center</Attraction_Title>
—Description text goes here. Donations accepted.. 1805 W. Indiana Ave.. 432/682-5785.
</Attraction>
<Attraction>
<Attraction_Title>I-20 Wildlife Preserve & Jenna Welch Nature Study Center</Attraction_Title>—Description text goes here. 2201 S. Midland Dr.. 432/853-9453. www.i20wildlifepreserve.org.
</Attraction>
<Attraction>
<Attraction_Title>Museum of the Southwest</Attraction_Title>—Description text goes here. Admission charged.. 1705 W. Missouri.. 432/683-2882. www.museumsw.org.
</Attraction>
<SubAttraction>
<SubAttraction_Title>Fredda Turner Durham Children's Museum</SubAttraction_Title>—Description text goes here. Admission charge.. 432/683-2882.
</SubAttraction>
</Attractions>
</City>
</Cities>
那么我要在这里做什么才能使子景点(在 MainAttraction 字段中具有值的景点)可以被拉入新的容器标签?我知道我们想为 SubAttractions 创建一个新模板,但我不知道如何只将所需的元素放入其中。如果对于更有经验的人来说不是太困难的话,我将非常感谢帮助找到可以插入的东西。
[原始 post 已被编辑以提供更多有用的信息。]
So what do I do here to make it so attractions with a MainAttraction value get displayed, tagged and styled differently?
这取决于样式的不同程度。如果它 非常 不同,您可能希望使用不同的模板来处理每种类型,例如:
<xsl:template match="Attraction">
<!-- code to process "regular" attraction -->
</xsl:template>
<xsl:template match="Attraction[string(MainAttraction)]">
<!-- code to process "main" attraction -->
</xsl:template>
否则,您可以使用 xsl:choose
and/or xsl:if
在同一模板中的两种类型之间进行分支。
编辑:
我在处理这两种类型的方式中看到的唯一区别是包含元素的名称:Attraction
或 SubAttraction
。
如果这个观察是正确的,我建议你尝试这种方式(最小化到只有问题的必要部分):
XSLT 1.0
<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:strip-space elements="*"/>
<xsl:template match="/Root">
<Cities>
<xsl:apply-templates select="City"/>
</Cities>
</xsl:template>
<xsl:template match="City">
<City>
<City_Name>
<xsl:value-of select="City_Name"/>
</City_Name>
<!-- more details here -->
<Attractions>
<xsl:apply-templates select="Attraction"/>
</Attractions>
</City>
</xsl:template>
<xsl:template match="Attraction">
<xsl:variable name="tag">
<xsl:choose>
<xsl:when test="string(MainAttraction)">SubAttraction</xsl:when>
<xsl:otherwise>Attraction</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$tag}">
<Attraction_Title>
<xsl:value-of select="normalize-space(Attraction_Title)"/>
</Attraction_Title>
<xsl:value-of select="Desc"/>
<!-- more details here -->
</xsl:element>
<xsl:apply-templates select="Attraction"/>
</xsl:template>
</xsl:stylesheet>
请注意,与您原来的问题不同,您现在将子景点显示为主要景点的子景点。这需要另一个 xsl:apply-templates select="Attraction"
从主要景点的上下文调用(如上所示)。
行
<xsl:template match="SubAttraction">
不会匹配任何内容,因为输入中没有 SubAttraction 节点 xml。
要获得匹配,您需要将其更改为
<xsl:template match="Attraction[../../Attraction]">
然后添加
<xsl:apply-templates select="Attraction"/>
行前
</Attraction>
在您的 xsl:template 匹配="Attraction" 模板中。