簡體   English   中英

XSLT問題中的for-each

[英]for-each in XSLT issue

我是XSLT的新手,並嘗試進行for-each循環,以便每個節點都可以匹配來自不同根目錄的另一個節點。 我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
    <class> 
        <students>
            <student> 
                <firstname>Dinkar</firstname> 
                <teacher_id>1</teacher_id>
            </student> 
            <student > 
                <firstname>Vaneet</firstname> 
                <teacher_id>2</teacher_id>
            </student> 
            <student> 
                <firstname>Jasvir</firstname> 
                <teacher_id>3</teacher_id>
            </student> 
        </students>
        <teachers>
            <teacher>
                <tfirstname>Dima</tfirstname>
                <teacher_id>1</teacher_id>
            </teacher>
            <teacher>
                <tfirstname>Vova</tfirstname>
                <teacher_id>2</teacher_id>
            </teacher>
            <teacher>
                <tfirstname>Denis</tfirstname>
                <teacher_id>3</teacher_id>
            </teacher>
        </teachers>
    </class>

我需要獲取以下XML輸出:

<?xml version="1.0" encoding="UTF-8"?>
<G2>
   <Student_Name>Dinkar</Student_Name>
   <TName>Dima</TName>
</G2>
<G2>
   <Student_Name>Vaneet</Student_Name>
   <TName>Vova</TName>
</G2>
<G2>
   <Student_Name>Jasvir</Student_Name>
   <TName>Denis</TName>
</G2>

意思是每個學生根據匹配的ID獲得老師的名字。 但是我得到了所有老師的名字:

<?xml version="1.0" encoding="UTF-8"?>
<G2>
   <Student_Name>Dinkar</Student_Name>
   <TName>Dima Vova Denis</TName>
</G2>
<G2>
   <Student_Name>Vaneet</Student_Name>
   <TName>Dima Vova Denis</TName>
</G2>
<G2>
   <Student_Name>Jasvir</Student_Name>
   <TName>Dima Vova Denis</TName>
</G2>

我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:for-each select="class/students/student">
            <G2>
            <Student_Name><xsl:value-of select="firstname"/></Student_Name>
            <xsl:if test="/class/teachers/teacher/teacher_id=teacher_id">
                <TName><xsl:value-of select="/class/teachers/teacher/tfirstname"/></TName>
            </xsl:if>
            </G2>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

你能幫忙嗎?

您的指示:

<xsl:value-of select="/class/teachers/teacher/tfirstname"/>

不考慮您當前的情況,選擇所有老師的名字。 您想將其更改為有條件的:

<xsl:value-of select="/class/teachers/teacher[teacher_id=current()/teacher_id]/tfirstname"/>

更好的是,將定義為:

<xsl:key name="teacher-by-id" match="teacher" use="teacher_id" />

然后將其用作:

<xsl:value-of select="key('teacher-by-id', teacher_id)/tfirstname"/>

執行查找。 如果只想在查找成功時才輸出名稱,則這特別方便:

<xsl:variable name="teacher" select="key('teacher-by-id', teacher_id)" />
<xsl:if test="$teacher">            
    <TName>
        <xsl:value-of select="$teacher/tfirstname"/>
    </TName>
</xsl:if>

對代碼進行最少的更改,您可以嘗試執行此操作(將Teacher_id保留在變量中,以便可以找到相應的元素)。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                exclude-result-prefixes="xs"
                version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:for-each select="//student">
            <xsl:variable name="teacher_id">
                <xsl:value-of select="teacher_id"/>
            </xsl:variable>
            <G2>
                <Student_Name><xsl:value-of select="firstname"/></Student_Name>
                <TName><xsl:value-of select="//teacher[teacher_id=$teacher_id]/tfirstname"/></TName>
            </G2>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM