Xslt查找是否存在具有id的元素并复制到新位置

时间:2015-12-02 17:07:01

标签: xml xslt

我正在尝试创建一个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解决这个问题。我的例子是简化的,但主要是相同的。

2 个答案:

答案 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;当然。

工作示例:http://xsltransform.net/jyRYYis