2

XSLT を使って何をしようとしているのか、まったくわからないことから始めましょう。私が持っているすべての XSLT は、他の人から継承したものです。スタイルシートが期待するように形成されていない XML (それが役立つ場合は EAD) があり、そのため XHTML に適切に変換されません。

基本的に、 はの兄弟ではなく、<unitdate>の子である必要があります。<unittitle>

ドキュメントのほとんどは次のようになります。

<c03 id="ref13" level="file">
<did>
<unittitle>1. President (White House)</unittitle>
<container id="cid192710" type="Box" label="Text">1</container>
<container parent="cid192710" type="Folder">2</container>
<unitdate normal="1953/1956" type="inclusive">1953-1956</unitdate>
</did>
</c03>

そして、次のようにする必要があります。

<c03 id="ref13" level="file">
<did>
<unittitle>1. President (White House)<unitdate normal="1953/1956" type="inclusive">1953-1956</unitdate></unittitle>
<container id="cid192710" type="Box" label="Text">1</container>
<container parent="cid192710" type="Folder">2</container>
</did>
</c03>

これを行う簡単な方法はありますか?同様の質問があることは知っていますが、適切に機能させるためにそれらを適応させるのに十分なほどよく理解していません。ありがとう。

4

2 に答える 2

2

これらのテンプレートを試してください:

<xsl:template match="unittitle[following-sibling::unitdate]">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    <xsl:copy-of select="following-sibling::unitdate"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="unitdate"/>

ID テンプレート:

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

ID テンプレートは、すべてをそのまま正確にコピーします。前の 2 つのテンプレートはunittitleunitdate兄弟が続く要素とunitdate要素自体がある特定のケースでそれをオーバーライドします。

おそらく、最初のテンプレートが ID テンプレートとほぼ同じであることに気付くでしょう。これは、他のすべて (つまりテキスト) を処理した後unittitle、次の要素もコピーすることを除いて、ID テンプレートと同じ方法でコピーするためです。unitdate

1行のunitdateテンプレートは、何も出力せずに処理することで、元の場所から単純に削除します。

于 2013-11-13T16:32:59.677 に答える
0

既存の XSLT を変更せずに、引き続き含まれる XML を処理できるようにするには、次の XSLT (1.0) セグメントを使用して問題を解決できます。

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="*">
      <xsl:copy>
    <xsl:apply-templates />
      </xsl:copy>
  </xsl:template>

  <xsl:template match="did">
      <xsl:copy>
         <xsl:apply-templates select="*[local-name()!='unitdate']"/>
      </xsl:copy>
  </xsl:template>

   <xsl:template match="unittitle">
       <xsl:element name="unittitle">
             <xsl:value-of select="text()"/>
             <xsl:copy-of select="../unitdate" />
       </xsl:element>
  </xsl:template>

  <xsl:template match="@*|text()|comment()|processing-instruction">
    <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>

ただし、これを使用しないことを真剣に検討する必要があります。既存の XSLT を変更するのは合理的なことです。これは、パフォーマンスのオーバーヘッドのみを生成します。

于 2013-11-13T16:29:07.107 に答える