[英]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.