1

次のような単純な HTML フラグメントがあります。

<a href="123">link</a>

私はそれをに変換する必要があります

<abc:href var="123">link</abc:href>

私は XSLT でそれを行うので、名前空間を追加する必要がありましたxsl:stylesheet

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

ほとんど問題なく動作しますが、残念ながら XSLT 変換は次のように XMLNS を出力に追加し続けます。

<abc:href var="123" xmlns:abc="http://abc.ru">link</abc:href>

xmlns 定義は必要ありません。削除できますか?

4

4 に答える 4

1

これは実際には問題になりますが、強くお勧めしますが、この不正な形式のXMLを生成する必要がある場合は、次のような命令を使用できます...

<xsl:value-of disable-output-escaping="yes" select="
  concat('&lt;abc:href var="',$href,'"&gt;',$link,'&lt;/abc:href&gt;')
 "/>

...ここで、$hrefと$linkは、適切な式のプレースマーカーです。


アップデート

OPのコメントに応えて、次のようなテンプレートを使用できます...

<xsl:template match="a">
  <xsl:value-of disable-output-escaping="yes" select="
    concat('&lt;abc:href var="',@href,'"&gt;',.,'&lt;/abc:href&gt;')
   "/>
</xsl:template>

この醜い解決策は、最後の手段としてのみ使用する必要があります。はるかに優れた解決策は、XSLTを使用して、ドキュメントの無効なフラグメントだけでなく、ドキュメント全体を作成することです。このようにして、ドキュメントは整形式になり、XSLTの完全なパワーとシンプルさに耐えることができます。

于 2012-08-29T12:20:27.920 に答える
1

ほとんど問題なく動作しますが、残念ながら XSLT 変換は次のように XMLNS を出力に追加し続けます。

<abc:href var="123" xmlns:abc="http://abc.ru">link</abc:href> 

xmlns 定義は必要ありません。削除できますか?

名前空間宣言を必要に応じて削除すると、(名前空間) 整形式でない XML ドキュメントが生成されるため、W3C XSLT 仕様で要求されているように、XSLT プロセッサは名前空間宣言を追加します。

名前空間宣言を共通の祖先 (生成された XML ドキュメントの最上位要素など) に配置することで、これらの名前空間宣言を「非表示」にすることができます。

完全な例を次に示します。

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

 <xsl:template match="/*">
  <top xmlns:abc="http://abc.ru">
   <xsl:apply-templates/>
  </top>
 </xsl:template>

 <xsl:template match="a[@href]">
   <xsl:element name="abc:href" namespace="http://abc.ru">
     <xsl:attribute name="var">
       <xsl:apply-templates/>
     </xsl:attribute>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

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

<html>
  <a href="123">link1</a>
  <a href="xxx">link2</a>
  <a href="yyy">link3</a>
  <a href="zzz">link4</a>
</html>

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

<top xmlns:abc="http://abc.ru">
   <abc:href var="link1"/>
   <abc:href var="link2"/>
   <abc:href var="link3"/>
   <abc:href var="link4"/>
</top>
于 2012-08-29T12:35:19.943 に答える
1

これは悲しいことですが、無効な xml が本当に必要です

XSLT は、不適切な XML の生成を防ぐように設計されています。質の悪い XML を生成したい場合は、XSLT を使用しないでください。

于 2012-08-29T14:13:53.563 に答える
-1

次のように、で試してみてくださいexclude-result-prefixes

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:abc="http://abc.ru"
                exclude-result-prefixes="abc">

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

    <xsl:template match="a">
     <href var="{@href}"><xsl:value-of select="."/></href>
    </xsl:template>

</xsl:stylesheet>
于 2012-08-29T12:05:22.750 に答える