【问题标题】:How does @select work in xsl:variable?@select 在 xsl:variable 中如何工作?
【发布时间】:2015-10-28 12:13:43
【问题描述】:

我有这个示例 XML 文件:

<?xml version="1.0" encoding="UTF-8" ?>

<Diplomanden>
    <student matrikelNr="91426" nachname="Q1" vorname="M1"/>
    <student matrikelNr="91427" nachname="Q2" vorname="M2"/>
    <student matrikelNr="91428" nachname="Q3" vorname="M3"/>
    <student matrikelNr="91429" nachname="Q4" vorname="M4"/>
    <student matrikelNr="91430" nachname="Q5" vorname="M5"/>

    <mitarbeiter persNr="111111" nachname="N1" vorname="V1"/>
    <mitarbeiter persNr="111112" nachname="N2" vorname="V2"/>
    <mitarbeiter persNr="111113" nachname="N3" vorname="V3"/>
    <mitarbeiter persNr="111114" nachname="N4" vorname="V4"/>

    <schreibt_DA_bei studentRef="91426" persRef="111111"/>
    <schreibt_DA_bei studentRef="91426" persRef="111112"/>
    <schreibt_DA_bei studentRef="91427" persRef="111111"/>
    <schreibt_DA_bei studentRef="91429" persRef="111113"/>
    <schreibt_DA_bei studentRef="91429" persRef="111113"/>
    <schreibt_DA_bei studentRef="91429" persRef="111112"/>
</Diplomanden>

还有一个转换文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="schreibt_DA_bei">
        <xsl:variable name = "sR" select="@studentRef"/>

        <xsl:variable name = "s" select="//student[@matrikelNr = $sR]"/>

        <!-- OUTPUT -->
Student <xsl:value-of select="normalize-space($s/@nachname)"/> schreibt Diplomarbeit
    </xsl:template>

    <xsl:template match="text()|@*"/>
</xsl:transform>

对于

<xsl:variable name = "s" select="//student[@matrikelNr = $sR]"/>

为什么变量s 的参数选择有效? // 表示“后代或自我”,我的实际节点是 schreibt_DA_bei。在我看来,“preceding-sibling::student”是对的(它也有效),但为什么“descendant-or-self”会找到合适的学生?

如果我执行一个 XPath 表达式,例如:/child::Diplomanden/child::schreibt_DA_bei/descendant-or-self::student 没有学生被选中。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    xsl:variable 中的 select 属性相对于当前节点起作用,但前提是给定 relative XPath 表达式。如果给定 absolute XPath 表达式,则当前节点无关紧要。

    //student[@matrikelNr = $sR]"/&gt; 与当前节点无关,因为它是绝对的,而不是相对的 XPath。

    如果它是.//student[@matrikelNr = $sR]"/&gt;(注意前导.),那么上下文很重要,当当前节点是schreibt_DA_bei 之一时,它不会选择任何student 元素是对的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-23
      • 2023-01-14
      • 2013-06-07
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      相关资源
      最近更新 更多