2

参照されている図/ノードを参照先にコピーする方法を探しています。

<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>

コピーされた図を指すように参照を更新することはケーキのアイシングになりますが、参照されている場所にノードをコピーするための情報と方法が欲しいです。

4

2 に答える 2

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>
于 2013-08-19T17:13:32.630 に答える
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、ノード セットを 2 番目の引数 (検索するキー値) として渡すと、結果は各キー値を順番に検索した結果のノード セットの和集合になるという関数の優れた機能を利用します。 . したがって、このパラグラフの要素のいずれかに一致key('figureById', xref/@linkend)するすべての図要素が得られますが、同じ図が複数回参照されている場合、挿入される図のコピーは 1 つだけです。idxref


コピーされた図を指すように参照を更新すると、ケーキのアイシングになります

これは、コピーされた図の ID を書き直して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(そしてあなたの例をルートタグでラップして適切な形式にする)を使用すると、これが生成されます

<?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>

生成された ID の正確な形式 (idpNNNNこの例では ) はプロセッサによって異なりますが、一意で一貫性があることが保証されています。

于 2013-08-19T17:47:46.083 に答える