我有一个适用于学校班级学生的数据库应用程序。我将大量数据放在一个包中发送到用户界面。要组装复杂的XML,我经常需要将多个数据获取作为XML,然后将它们组合在一起。
我正在尝试找到一种方法来使用XSLT执行类似于SQL连接的操作。例如,给定以下两个XML文档:
<Xml>
<Classes>
<Class Name="BIOLOGY101" ClassId="11"/>
<Class Name="PHYSICS101" ClassId="13"/>
<Class Name="CALCULUS101" ClassId="17"/>
<Class Name="BIOLOGY101" ClassId="19"/>
</Classes>
</Xml>
<Xml>
<Students>
<Student Name="Bob Johnson" ClassId="11"/>
<Student Name="Bob Johnson" ClassId="17"/>
<Student Name="Bob Johnson" ClassId="19"/>
<Student Name="Joe Jackson" ClassId="11"/>
<Student Name="Joe Jackson" ClassId="13"/>
<Student Name="Joe Jackson" ClassId="17"/>
<Student Name="Rick Robertson" ClassId="13"/>
<Student Name="Rick Robertson" ClassId="17"/>
<Student Name="Rick Robertson" ClassId="19"/>
</Students>
</Xml>我想通过一个XSLT来运行它们,以生成this:
<Xml>
<Classes>
<Class Name="BIOLOGY101" ClassId="11">
<Student Name="Bob Johnson"/>
<Student Name="Joe Jackson"/>
</Class>
<Class Name="PHYSICS101" ClassId="13">
<Student Name="Joe Jackson"/>
<Student Name="Rick Robertson"/>
</Class>
<Class Name="CALCULUS101" ClassId="17">
<Student Name="Rick Robertson" "/>
<Student Name="Joe Jackson"/>
<Student Name="Bob Johnson"/>
</Class>
<Class Name="BIOLOGY101" ClassId="19">
<Student Name="Bob Johnson"/>
<Student Name="Rick Robertson" />
</Class>
</Classes>
</Xml>注意,我在节点中省略了ClassId属性。
我可以将这两个XML文档组装成一个文档,然后传递给XSLT,如果这样做更容易处理的话。
由于此数据来自数据库,因此我将连接不同的XML文档。我可能会加入学校的班级,或者学生的成绩,或者学校的活动。但是它们都将遵循相同的模式:来自子节点的数字属性将对应于父节点中的数字属性。
发布于 2013-03-09 04:45:48
JLRishe的答案是正确的,并且可以完美地工作,但是如果您需要使用XSLT将这两个文件组合在一起,您可以这样做,以防其他人出现
a.xml
<Xml>
<Classes>
<Class Name="BIOLOGY101" ClassId="11"/>
<Class Name="PHYSICS101" ClassId="13"/>
<Class Name="CALCULUS101" ClassId="17"/>
<Class Name="BIOLOGY101" ClassId="19"/>
</Classes>
</Xml>b.xml
<Xml>
<Students>
<Student Name="Bob Johnson" ClassId="11"/>
<Student Name="Bob Johnson" ClassId="17"/>
<Student Name="Bob Johnson" ClassId="19"/>
<Student Name="Joe Jackson" ClassId="11"/>
<Student Name="Joe Jackson" ClassId="13"/>
<Student Name="Joe Jackson" ClassId="17"/>
<Student Name="Rick Robertson" ClassId="13"/>
<Student Name="Rick Robertson" ClassId="17"/>
<Student Name="Rick Robertson" ClassId="19"/>
</Students>
</Xml>样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Class">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<!-- Apply <Student> elements from b.xml -->
<xsl:apply-templates
select="document('b.xml')/Xml/Students/Student
[@ClassId = current()/@ClassId]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Student">
<xsl:copy>
<xsl:apply-templates select="@Name"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>输出
<?xml version="1.0"?>
<Xml>
<Classes>
<Class Name="BIOLOGY101" ClassId="11">
<Student Name="Bob Johnson"/>
<Student Name="Joe Jackson"/>
</Class>
<Class Name="PHYSICS101" ClassId="13">
<Student Name="Joe Jackson"/>
<Student Name="Rick Robertson"/>
</Class>
<Class Name="CALCULUS101" ClassId="17">
<Student Name="Bob Johnson"/>
<Student Name="Joe Jackson"/>
<Student Name="Rick Robertson"/>
</Class>
<Class Name="BIOLOGY101" ClassId="19">
<Student Name="Bob Johnson"/>
<Student Name="Rick Robertson"/>
</Class>
</Classes>
</Xml>https://stackoverflow.com/questions/15302356
复制相似问题