1

我的 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 中打印Professor,RoomSubject.

例如:

对于教授:Name1,对于房间 IA-301,对于主题 Kolokvij。

4

2 回答 2

1

我会回答这个问题,但是对于未来,请多思考一下你的问题。

假设 WorkingTime 是驱动程序/上下文并假设您的 xml 用“根”标签包装,那么您将编写:

<!-- 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])"/>   

卡尔..

于 2013-08-24T06:50:15.433 回答
1

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

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

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

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

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

要使用密钥,假设您当前位于School元素上(即在匹配“School”的模板中),您将获得Professor的值,如下所示:

<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>

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

于 2013-08-24T09:06:29.650 回答