我正在尝试创建一个xslt文件,因此我可以找到一个引用我的xml文件区域内其他元素的元素,如果存在,我想直接用数据替换对数据的引用。
所以来自:
<school>
<People>
<teacher Id="1">
<name>Bill</name>
</teacher>
<teacher Id="2">
<name>Peter</name>
</teacher>
</People>
<Courses>
<Course>
<name>Maths</name>
<teacher Ref="1"/>
</Course>
<Course>
<name>English</name>
<teacher Ref="3"/>
</Course>
<People>
<teacher Id="1">
<name>Bill</name>
</teacher>
<teacher Id="2">
<name>Peter</name>
</teacher>
<teacher Id="3">
<name>Jill</name>
</teacher>
</People>
</Courses>
</school>
到
<school>
<People>
<teacher Id="1">
<name>Bill</name>
</teacher>
<teacher Id="2">
<name>Peter</name>
</teacher>
</People>
<Courses>
<Course>
<name>Maths</name>
<teacher Ref="1"/>
</Course>
<Course>
<name>English</name>
<teacher Id="3">
<name>Jill</name>
</teacher>
</Course>
<People>
<teacher Id="1">
<name>Bill</name>
</teacher>
<teacher Id="2">
<name>Peter</name>
</teacher>
<teacher Id="3">
<name>Jill</name>
</teacher>
</People>
</Courses>
</school>
所以你基本上将以下课程更新为:
<Course>
<name>English</name>
<teacher Id="3">
<name>Jill</name>
</teacher>
</Course>
我基本上试图用xml修复数据问题,但我很难用xslt解决这个问题。我的例子是简化的,但主要是相同的。
答案 0 :(得分:0)
试一试。你有两次定义相同的老师,但[1]选择了第一场比赛,这有点奇怪。
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name='teachers' select='//teacher'/>
<xsl:template match="Course/teacher">
<xsl:variable name='id' select='@Ref'/>
<xsl:variable name='teacher' select='$teachers[@Id=$id][1]'/>
<xsl:copy-of select='$teacher'/>
</xsl:template>
<xsl:template match="/ | @* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
与William Walseth的答案类似,但使用了xsl:key
内容。
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="teachers" match="teacher" use="@Id"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="teacher[@Ref]">
<xsl:variable name="ref" select="@Ref"/>
<xsl:apply-templates select="//teacher[count(.|key('teachers',$ref)[1])=1]"/>
</xsl:template>
</xsl:stylesheet>
注意:
您有teacher
个重复元素(@Id
值与另一个teacher/@Id
匹配)。此答案将使用第一次出现的teacher
和匹配的Id
属性。
我认为你打算更新&#34;数学&#34;当然。