如果某个归档<a class="section-ref">
的{{1}}值与@href
的{{1}} @id
相关联,那么我想要将锚<div class="sect1">
的值更改为父块的<div class="chunk">
。我不确定如何通过XSLT / XPath找到父块的@href
。
XML:
@id
XSLT:
@id
期望的输出:
<book>
<div>
<p>In the <a class="section-ref" href="#i2398" id="i2397">next section</a>, we turn lorem ipsum.</p>
</div>
<div class="extend" id="i100949">
<div class="check" id="i100950">
<h1 class="title">Check</h1>
<a class="other-ref" href="folder/other-ref.xml" id="i100953"></a>
</div>
</div>
<div class="chunk" id="i100954">
<h1 class="title">8.4</h1>
<div class="other-section" id="i100955">
<p id="i100956"> Lorem Ipsum</p>
</div>
<div class="sect1" id="i2398">
<h1 class="title">Lorem Ipsum</h1>
<p>Blah blah blah</p>
</div>
</div>
请注意,section-ref anchor @href值更改为父块(i100954)的@id:
<!-- Identity template -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--Change section-ref @href to parent chunk @id if they are @ids of a sect1-->
<xsl:template match="a[@class='section-ref']">
<xsl:variable name="section-id" select="substring-after(./@href, '#')"/>
<xsl:variable name="section" select="$section-id = //div[@class='chunk']/div[@class='sect1']/@id"/>
<xsl:choose>
<xsl:when test="$section">
<xsl:copy>
<xsl:attribute name="href" select="NEED XPATH HERE"/>
<xsl:apply-templates select="(node() | @*) except @href"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 0 :(得分:1)
填写占位符&#34; NEED XPATH HERE&#34;在你的例子中,你应该使用
../../../div[@class='chunk']/@id
或整个表达:
<xsl:attribute name="href" select="../../../div[@class='chunk']/@id" />
这可以为您提供所需的结果。
答案 1 :(得分:1)
我会定义一个引用 <xsl:key name="ref" match="div[@class = 'sect1']" use="@id"/>
<xsl:template match="a[@class = 'section-ref' and key('ref', substring(@href, 2))]/@href">
<xsl:attribute name="{name()}" select="'#' || key('ref', substring(., 2))/parent::div/@id"/>
</xsl:template>
的键,然后您可以选择父div的ID:
concat
https://xsltfiddle.liberty-development.net/jyH9rM8有一个示例,它是XSLT 3但是对于XSLT,您只需要使用||
而不是xsl:mode
运算符来构造新的属性值,然后您需要使用身份转换模板(您已经拥有)而不是{{1}}。
答案 2 :(得分:0)
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="book">
<xsl:element name="book">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="div">
<xsl:element name="div">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="p">
<xsl:element name="p">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="h1">
<xsl:element name="h1">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="a[@class='section-ref']">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="ancestor::div/following-sibling::div[@class='chunk']/@id"/>
</xsl:attribute>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
我试图以简单的方式获得你的输出