我正在寻找一种方法将任何引用的图形/节点复制到它被引用的位置。
<chapter id="intro">
<title>Introduction</title>
<para>Welcome to our new product. One of its
new features is a <xref linkend="some-figure"/>.
Other new features include ...
</para>
<para>Grab that <xref linkend="some-figure"/> and pull it here too.</para>
</chapter>
<chapter>
<title>Some other chapter</title>
<para>This chapter contains the figure!
<figure id="some-figure"><title>my figure...</title><mediaobject>...</mediaobject></figure>
</para>
</chapter>
可以变成:
<chapter id="intro">
<title>Introduction</title>
<para><figure><title>my figure...</title><mediaobject>...</mediaobject></figure>
Welcome to our new product. One of its
new features is a <xref linkend="some-figure"/>.
Other new features include ...
</para>
<para><figure><title>my figure...</title><mediaobject>...</mediaobject></figure>
Grab that <xref linkend="some-figure"/> and pull it here too.
</para>
</chapter>
<chapter>
<title>Some other chapter</title>
<para>This chapter contains the figure!
<figure id="some-figure"><title>my figure...</title><mediaobject>...</mediaobject></figure>
</para>
</chapter>
更新引用以指向复制的数字将是锦上添花,但我想了解有关将节点复制到引用位置的信息和方式。
答案 0 :(得分:0)
如果您只想将xref
替换为相应的figure
,则可以将@linkend
与@id
匹配。
示例:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xref">
<xsl:apply-templates select="//figure[@id=current()/@linkend]"/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
因此,对于包含para
的任何xref
,您希望将链接的数字(减去id
属性)复制到para
内容的开头。我会定义一个键,以便通过id快速访问figure
元素:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="figureById" match="figure" use="@id" />
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="para[.//xref]">
<xsl:copy>
<xsl:apply-templates select="@*" /><!-- may not be necessary -->
<!-- copy in referenced figures -->
<xsl:apply-templates select="key('figureById', .//xref/@linkend)"
mode="noid"/>
<!-- and continue with child nodes as normal -->
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
<!-- special almost-identity template to remove the id attribute -->
<xsl:template match="node()" mode="noid">
<xsl:copy>
<xsl:apply-templates select="@*[local-name() != 'id']|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这利用了key
函数的一个很好的特性,如果你传递一个节点集作为它的第二个参数(要查找的键值),那么结果就是结果的节点集的并集从依次查找每个键值。因此,key('figureById', xref/@linkend)
会为您提供id
匹配此1>}元素中所有的所有数字元素,但如果同一个数字被多次引用,只获得插入图形的一个副本。
更新引用以指向复制的数字将是锦上添花
您可以通过重写复制数字的ID以包含目标段落的xref
来实现此目的,然后在generate-id()
链接上使用相同的转换。像这样:
xref
在我的系统上,使用 <xsl:template match="para[.//xref]">
<xsl:copy>
<xsl:apply-templates select="@*" /><!-- may not be necessary -->
<!-- copy in referenced figures, modifying their ids to include our own -->
<xsl:apply-templates select="key('figureById', .//xref/@linkend)"
mode="modify-id">
<xsl:with-param name="targetNode" select="." />
</xsl:apply-templates>
<!-- and continue with child nodes as normal -->
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="node()" mode="modify-id">
<xsl:param name="targetNode" />
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="id">
<xsl:value-of select="concat(generate-id($targetNode), '-', @id)" />
</xsl:attribute>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
<!-- munge linkend attributes in the same way we did for copied figure ids -->
<xsl:template match="para//xref/@linkend">
<xsl:attribute name="linkend">
<xsl:value-of select="concat(generate-id(ancestor::para[1]), '-', .)" />
</xsl:attribute>
</xsl:template>
(并将示例包装在根标记中以使其格式正确),这会产生
xsltproc
生成的ID的确切形式(本例中为<?xml version="1.0"?>
<root>
<chapter id="intro">
<title>Introduction</title>
<para><figure id="idp1744-some-figure"><title>my figure...</title><mediaobject>...</mediaobject></figure>Welcome to our new product. One of its
new features is a <xref linkend="idp1744-some-figure"/>.
Other new features include ...
</para>
<para><figure id="idp2656-some-figure"><title>my figure...</title><mediaobject>...</mediaobject></figure>Grab that <xref linkend="idp2656-some-figure"/> and pull it here too.</para>
</chapter>
<chapter>
<title>Some other chapter</title>
<para>This chapter contains the figure!
<figure id="some-figure"><title>my figure...</title><mediaobject>...</mediaobject></figure>
</para>
</chapter>
</root>
)因处理器而异,但保证它们是唯一且一致的。