如何读取id并将其与名称连接

时间:2013-08-24 06:35:51

标签: xslt

我的XML:

<WorkingTime>
    <FromTime>08:00</FromTime>
    <ToTime>11:00</ToTime>
    <Name>Izpit Matematika</Name>
    <Owner>Marko Lackovic</Owner>
    <Category>
        <School Professor="111" Room="1" Subject="882" />
    </Category>
</WorkingTime>

<Professors>
    <Professor email="xxx" id="111" code="String">Name 1</Professor>
    <Professor email="xxx" id="222" code="String">Name 2</Professor>
    <Professor email="xxx" id="333" code="String">Name 3</Professor>
</Professors>
<Rooms>
    <Room id="1">IA-301</Room>
    <Room id="2">A-302</Room>
    <Room id="3">A-303</Room>
    <Room id="4">A-304</Room>
    <Room id="5">A-305</Room>
    <Room id="6">A-306</Room>

</Rooms>
<Subjects>
    <Subject id="881">Vaje</Subject>
    <Subject id="882">Kolokvij</Subject>
    <Subject id="883">Predmet</Subject>
    <Subject id="884">Izpit</Subject>
</Subjects>

我现在如何在XSLT中打印ProfessorRoomSubject

例如:

  

教授:姓名1,IA-301室和主题Kolokvij。

2 个答案:

答案 0 :(得分:1)

我会回答这个问题,但是,为了将来,请更多地考虑一下你的问题。

假设WorkingTime是驱动程序/上下文并假设你的xml包含一个“root”标记,那么你会写:

<!-- a little shortcut variable -->
<xsl:variable name="school" select="/root/WorkingTime/Category/School"/>

<xsl:value-of select="concat('For Professor: ', 
                      /root/Professors/Professor[@id=$school/@Professor], 
                      ', for Room: ', /root/Rooms/Room[@id=$school/@Room], 
                      ', and for Subject: ', 
                      /root/Subjects/Subject[@id=$school/@Subject])"/>   

卡尔..

答案 1 :(得分:1)

您需要在此处阅读 xsl:key ,因为这样可以直接查找您需要的记录,并且在查找多个学校的记录时更高效

要根据 id 属性查找教授记录,您可以按如下方式定义密钥:

<xsl:key name="Professor" match="Professor" use="@id" />

同样,要使用 id 属性值查找 Room 元素:

<xsl:key name="Room" match="Room" use="@id" />

要使用密钥,假设您当前位于学校元素上(即在匹配“学校”的模板中),您将获得教授的价值像这样:

<xsl:value-of select="key('Professor', @Professor)" />

所以,你可能会有这样的模板

<xsl:template match="School">
   Professor: <xsl:value-of select="key('Professor', @Professor)" />
   Room: <xsl:value-of select="key('Room', @Room)" />
</xsl:template>

主题扩展此功能显然是直截了当的。 (请注意,您显然需要其他代码来首先选择学校元素,例如<xsl:apply-templates select="//School" />