1

一部のファイルで問題が発生しています。問題を解決するためのヘルプを使用できます。私はhtmlからxmlに変換しています。<b>または<u>または<i>タグを単独で使用することがあります。

<xsl:template match="i">
<emphasis italic="yes">
<xsl:apply-templates select="*|@*|text()"/>
</emphasis>
</xsl:template>

または b は太字、u は下線。

時々私は入れ子<u>になっています<b>

これらのために私は使用します

<xsl:template match="b/u">
<xsl:apply-templates select="*|@*|text()"/>
</xsl:template>

これは、u

<xsl:template match="b[u]">
<emphasis bold="yes" underline="yes">
<xsl:apply-templates select="*|@*|text()"/>
</emphasis>
</xsl:template>

bこれは、 の後に を変換することuです。

u今私の問題は、ネストされた にiネストされたときにどうするかですb。これのコードは何ですか?

4

2 に答える 2

0

これは単純で短い解決策です: 2 つのテンプレートのみで、明示的な条件付き命令はありません:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" exclude-result-prefixes="my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:names>
   <n short="b">bold</n>
   <n short="i">italic</n>
   <n short="u">underline</n>
 </my:names>

 <xsl:variable name="vNames" select="document('')/*/my:names/*"/>

 <xsl:template match=
  "node()[not(contains('+b+i+u+', concat('+',name(),'+')))]
         /*[contains('+b+i+u+', concat('+',name(),'+'))]
  ">
   <emphasis>
      <xsl:apply-templates select="." mode="emph"/>
   </emphasis>
  </xsl:template>

 <xsl:template mode="emph"
   match="*[contains('+b+i+u+', concat('+',name(),'+'))]">
   <xsl:attribute name="{$vNames[@short=name(current())]}">yes</xsl:attribute>
   <xsl:apply-templates select="node()" mode="emph"/>
 </xsl:template>
</xsl:stylesheet>

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

<test>
   <b>bold</b>
   <i>Italic</i>
   <b><i>bold Italic</i></b>
   <u><b><i>bold Italic underline</i></b></u>
</test>

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

<emphasis bold="yes">bold</emphasis>
<emphasis italic="yes">Italic</emphasis>
<emphasis bold="yes" italic="yes">bold Italic</emphasis>
<emphasis underline="yes" bold="yes" italic="yes">bold Italic underline</emphasis>
于 2013-05-01T03:27:10.860 に答える