0

ある XSD を、フォーマットがわずかに異なる別の XSD に変換する XSL があります。(基本的に対象ファイルは正規化されます)。ターゲットのその他の大きな違いは、デフォルトの名前空間とターゲットの名前空間が追加されていることです。名前空間を実際に取得するのに問題があります。これが私の XSL のスニペットです。

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8"/>
    <xsl:variable name="Unions" select="'Yes'"/>
    <xsl:variable name="myname" select="//Table/Name"/>
    <xsl:variable name="namespace" select="concat('http://mynamespace/', $myname)"/>
  <xsl:template match="/">
    <xsl:element name="xsd:schema" namespace="http://www.w3.org/2001/XMLSchema" xmlns="$namespace"

      <xsl:attribute name="targetNamespace">
        <xsl:value-of select="$namespace"/>
      </xsl:attribute>
      <xsl:attribute name="elementFormDefault">qualified</xsl:attribute>
      <xsl:attribute name="attributeFormDefault">unqualified</xsl:attribute>
...
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

そして、これは私が得ているものです:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema targetNamespace="http://mynamespace/somename" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
...
</xsd:schema>

そして、すべての子ノードに xmlns="$namespace" がタグ付けされます。私は XSLT の完全な専門家ではありません。BizTalk マップがすべてを生成するため、自分で開発する必要はありませんでしたが、この XSL は、BizTalk マップで処理できるよりも複雑でした。

ああ、私は XSLT 1.0 に制限されています

4

1 に答える 1

0

動的に生成された値を使用して名前空間ノードを生成することは、XSLT1では実際には実行できないことです。XSLT 2はxsl:namespace、そのようなものを構築するために特別に追加します。

XSLT 1で立ち往生しているとおっしゃいましたが、node-set()拡張機能を提供するEXSLTまたはその他の拡張名前空間を利用できますか?もしそうなら、あなたは行くことができます

 <xsl:template match="/">

 <xsl:variable name="x">
 <xsl:element name="x" namespace="{$namespace}">
   <xsl:element name="xsd:schema" namespace="http://www.w3.org/2001/XMLSchema">
   ....
 </xsl:variable>
 <xsl:copy-of select="xx:node-set($x)/*/*"/>
</xsl:template>

目的の名前空間にスプリアス要素<x>を作成すると、名前空間ノードがその子xs:schema要素に強制されます。この子要素は、ノードセット拡張関数がある場合に抽出できます。

于 2012-06-21T17:56:36.020 に答える