使用XSLT设置嵌套XML元素的样式?
我是一名印刷设计师,正在编写一本旅游指南,我们最近开始使用XML标记的内容和XSLT样式管理该指南。除了这个小问题,它基本上是有效的,这个小问题已经把我们逼到了绝境!我们有一些子吸引力列表,它们应该显示为“子”列表,我们可以在InDesign布局中对其进行不同的样式设置,它们在XML中通过在MainAttraction标记中为其“父”吸引力标注一个值来进行标注 我的理解是,我们需要.XSL来注意MainAttraction标记中是否有值,如果有,则将与该吸引相关的元素拉到不同的容器标记下,以便我们可以对它们进行不同的样式设置。我只是在做了一些基本的训练和在论坛上搜索之后,还没有机会为它编写语法 以下是我正在尝试的,除了子景点(它们在相关父列表的景点标签中列出),它可以正确地拉入所有内容: XSLT使用XSLT设置嵌套XML元素的样式?,xml,xslt,adobe-indesign,Xml,Xslt,Adobe Indesign,我是一名印刷设计师,正在编写一本旅游指南,我们最近开始使用XML标记的内容和XSLT样式管理该指南。除了这个小问题,它基本上是有效的,这个小问题已经把我们逼到了绝境!我们有一些子吸引力列表,它们应该显示为“子”列表,我们可以在InDesign布局中对其进行不同的样式设置,它们在XML中通过在MainAttraction标记中为其“父”吸引力标注一个值来进行标注 我的理解是,我们需要.XSL来注意MainAttraction标记中是否有值,如果有,则将与该吸引相关的元素拉到不同的容器标记下,以便我
<?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输入示例(请注意,子景点示例Fredda Turner Durham儿童博物馆在其主要景点标签中有一个值,并嵌套在其父列表的景点标签中)
米德兰
大弯国家
127,598
2,891
L-9/KK-4
米德兰游客中心米德兰会议中心;访客局:周一至周六上午8:00至下午5:00开放,北大街109号,800/624-6435.1406 W.I-20(136出口)。周一上午9:00至下午5:00开放,周一至周六432/683-2882800/624-6435a href=”http://www.visitmidlandtexas.com“www.visitmidlandtexas.com/a
米德兰
说明文字在这里。
海利图书馆;历史中心
说明文字在这里。
接受捐款。
周一至周五上午9点至下午5点开放。
印第安纳大道西1805号。
432/682-5785
I-20野生动物保护区及;珍娜韦尔奇自然研究中心
说明文字在这里。
每天开放黄昏-黎明。
2201南米德兰博士。
432/853-9453
www.i20wildlifeperve.org
西南博物馆
说明文字在这里。
入场费。
开放时间为周二至周六上午10点至下午5点,周日下午2点至5点。
1705年,密苏里州西部。
432/683-2882
www.museumsw.org
弗雷达·特纳达勒姆儿童博物馆
说明文字在这里。
受理
<?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>
<?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>
<?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>
<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: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:template match="SubAttraction">
<xsl:template match="Attraction[../../Attraction]">
<xsl:apply-templates select="Attraction"/>
</Attraction>