0

XSLT での変換中にノード コンテンツのエンコードを実行できません。私の入力XMLは以下です:

  <?xml version="1.0" encoding="iso-8859-1"?>
  <!-- Edited by XMLSpy® -->
  <catalog>
   <cd>
     <title>D-Link</title>
     <artist>Bob Dylan</artist>
     <country>USA</country>
   </cd>
   <cd>
    <title>x-<i>NetGear</i></title>
    <artist>Rod Stewart</artist>
    <country>UK</country>
   </cd>
   <cd>
    <title>LG</title>
    <artist>Andrea Bocelli</artist>
    <country>EU</country>
   </cd>
 </catalog>

XSLT は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"  
 exclude-result-prefixes="msxsl">

 <xsl:output method="xml" indent="yes"/>

 <xsl:template match="/">
  <Root>
    <xsl:for-each select="catalog/cd">
    <Product>
      <xsl:attribute name="title">          
        <xsl:copy-of select="title/node()"/>          
      </xsl:attribute>
    </Product>
   </xsl:for-each>
  </Root>
 </xsl:template>
</xsl:stylesheet>

現在、次のようなエラーが発生しています。2 番目の CD タイトルを繰り返し処理している間、タイプ '属性' のノード内でタイプ '要素' のアイテムを構築できません。

予想される出力は以下のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Product title="D-Link" />
  <Product title="x-&lt;i&gt;NetGear&lt;/i&gt;" />
  <Product title="LG" />
</Root>

誰かが上記の問題で私を助けてくれますか?

4

1 に答える 1

1

<xsl:copy-of>その名前が意味することを試みます: 要素を含む選択されたノードをアトリビュートにコピーしようとします。もちろん、属性には要素ではなくテキストのみを含めることができます。

専用のテンプレートを使用して「偽のタグ」を作成できます。

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

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <Root>
      <xsl:for-each select="catalog/cd">
        <Product>
          <xsl:attribute name="title">
            <xsl:apply-templates select="title/node()" mode="escape-xml"/>
          </xsl:attribute>
        </Product>
      </xsl:for-each>
    </Root>
  </xsl:template>

  <xsl:template match="*" mode="escape-xml">
    <xsl:value-of select="concat('&lt;',local-name(),'>')"/>
    <xsl:apply-templates select="node()"/>
    <xsl:value-of select="concat('&lt;/',local-name(),'>')"/>
  </xsl:template>
</xsl:stylesheet>

これにより、望ましい結果が得られます。

于 2013-07-03T15:25:45.610 に答える