【发布时间】:2015-09-09 22:07:08
【问题描述】:
我是一名印刷设计师,正在制作一本旅行指南,我们最近开始使用 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 Children's Museum,在其主要景点标签中具有价值,并嵌套在其父列表的景点标签中)
<?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>
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 创建一个新模板,但我不知道如何只将所需的元素放入其中。如果对于更有经验的人来说不是太难的话,我将非常感谢帮助在这里找到可以插入的东西。
[原始帖子已被编辑以提供更多有用的信息。]
【问题讨论】:
标签: xml xslt adobe-indesign