0

XSLT スクリプトから次の行を出力しようとしています。の直後の最初の行ですxsl:template match="/"。私がやろうとしているのは、XML ドキュメントを XML スキーマに変換することでありxs:schema、特定の方法でタグを出力する必要があります。

<xs:schema xmlns:ed="http://test1"  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="{$ns_name}" xmlns:tns="{$ns_name}" elementFormDefault="qualified" attributeFormDefault="unqualified" xsi:schemaLocation="http://test1 file://XmlSchemaAppinfo.xsd">

$ns_nameですxsl:param name="ns_name"targetNamespace="{$ns_name}"正しく解決されますが、xmlns:tns="{$ns_name}"文字通り出力 されます

<xs:schema targetNamespace="akolodk" elementFormDefault="qualified" attributeFormDefault="unqualified" xsi:schemaLocation="http://test1 file://XmlSchemaAppinfo.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ed="test1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="{$ns_name}">
4

2 に答える 2

0

XSL では、属性値テンプレートを使用して ('{}' 表記を使用して)記述できるのは一部の属性だけです。特に、xmlns 属性は表記法をサポートしていません。

于 2013-03-29T09:27:55.917 に答える
0

名前空間の宣言は、同じように見えますが、属性と同じようには扱われません。xmlns:tnsXSLT プロセッサに到達する前に、スタイルシートが解析されたときに XML パーサーによって処理されます。

XSLT 2.0 をお持ちの場合は、使用できます

<xsl:namespace name="tns" select="$ns_name"/>

結果ツリーに名前空間ノードを作成することはできますが、XSLT 1.0 で動的名前空間を生成する簡単な方法はわかりません。を使用することはできませんxsl:attribute。仕様では、

<xsl:attribute name="xmlns:xsl" namespace="whatever">http://www.w3.org/1999/XSL/Transform</xsl:attribute>

はエラーではなく、名前空間宣言ではなく属性を生成します。プロセッサは、xmlnsで指定されたプレフィックスを無視する必要nameがあり、別のプレフィックスを使用して属性を出力する必要があります。

プロセッサが exsltnode-set拡張機能をサポートしている場合、次のように動作する可能性があります。

<xsd:schema .....>
  <xsl:variable name="tnsElement">
    <xsl:element name="tns:dummy" namespace="{$ns_name}"/>
  </xsl:variable>
  <xsl:copy-of select="exsl:node-set($tnsElement)/*/namespace::tns"/>

ただし、プロセッサは属性のプレフィックスを無視しxsl:element nameて、同じ URI にバインドされた別のプレフィックスを使用することができます。プロセッサでテストする必要があります。

(そして、要素に追加する必要がありますxmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl") xsl:stylesheet

于 2013-03-29T09:59:28.397 に答える