0

タグとテキストを含むタグがあります。

<p>

Hello world <xref rid='1234'>1234</xref> this is a new world starting
<xref rid="5678">5678</xref>
finishing the new world

</p>

xsltを使用して変換します。出力では、<xref>forを置き換える必要<a>があり、テキストは同じ形式である必要があります。

<p>

Hello world <a href='1234'>1234</a> this is a new world starting
<a href="5678">5678</a>
finishing the new world

</p>
4

2 に答える 2

0

XSLTでのこの種のことへの標準的なアプローチは、入力から出力まですべてを逐語的にコピーするIDテンプレートであり、何かを変更したいときに特定のテンプレートでオーバーライドします。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!-- identity template to copy everything as-is unless overridden -->
  <xsl:template match="*@|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

  <!-- replace xref with a -->
  <xsl:template match="xref">
    <a><xsl:apply-templates select="@*|node()" /></a>
  </xsl:template>

  <!-- replace rid with href -->
  <xsl:template match="xref/@rid">
    <xsl:attribute name="href"><xsl:value-of select="." /></xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

xrefすべての要素に確実にrid属性があることがわかっている場合は、2つの「特定の」テンプレートを1つに組み合わせることができます。

この情報はXPathデータモデルでは利用できないため、XSLTベースのソリューションでは、一部の入力要素が属性に一重引用符を使用し、他の要素が二重引用符を使用したという事実を保持できないことに注意してください(どちらの形式も完全に同等です。 XMLパーサーに関する限り)。XSLTプロセッサは、入力要素がどのように見えるかに関係なく、出力するすべての要素に対して常にどちらか一方を使用する可能性があります。

于 2013-03-26T14:40:43.557 に答える
0

解決策は非常に単純です(2つのテンプレートのみ):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="xref">
   <a href="{@rid}"><xsl:apply-templates/></a>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<p>

Hello world <xref rid='1234'>1234</xref> this is a new world starting
<xref rid="5678">5678</xref>
finishing the new world

</p>

必要な正しい結果が生成されます。

<p>

Hello world <a href="1234">1234</a> this is a new world starting
<a href="5678">5678</a>
finishing the new world

</p>

説明

  1. IDルールは、実行対象として選択されたすべてのノードを「現状のまま」コピーします。

  2. AVT(属性値テンプレート)を使用すると、xsl:attribute

于 2013-03-26T14:45:52.513 に答える