1

XML バージョン 1

<inboundData xmlns="urn:college:names:ws:docexchange">
<Root>
        <College Version="5.0" xmlns:cidx="urn:abc:names:specification:col:schema:all:5:0" xmlns="urn:abc:names:specification:col:schema:all:5:0">
           <Header>
              <Address>
                 <AddressLine1>4600 Big Tree Way</AddressLine1>
              </Address>
           </Header>
    </College>
</Root>
</inboundData>

XML バージョン 2

<inboundData xmlns="urn:college:names:ws:docexchange">
<Root>
        <ns1:College Version="5.0" xmlns:ns1="urn:abc:names:specification:col:schema:all:5:0">
           <ns1:Header>
              <ns1:Address>
                 <ns1:AddressLine1>4600 Big Tree Way</ns1:AddressLine1>
              </ns1:Address>
           </ns1:Header>
    </ns1:College>
</Root>
</inboundData>

XSL コード

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="urn:abc:names:specification:col:schema:all:5:0" xmlns:b="urn:college:names:ws:docexchange">
<xsl:template match="/">
    <xsl:copy-of select="b:inboundData/b:College/*"/>
</xsl:template>
</xsl:stylesheet>

XSL コードの修正。(ハンセンの回答を読んだ後、エラーに気づきました)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="urn:abc:names:specification:col:schema:all:5:0" xmlns:b="urn:college:names:ws:docexchange">
<xsl:template match="/">
    <xsl:copy-of select="b:inboundData/b:Root/*"/>
</xsl:template>
</xsl:stylesheet>

XSL コードは XML バージョン 1 でうまく機能します。余分な名前空間「ns1」が原因で、タイプ 2 では機能しません。これらの両方のバージョンで xsl コードを機能させるにはどうすればよいですか? 教えてください!

4

2 に答える 2

6

次のように、要素をローカル名で一致させることができます

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:a="urn:abc:names:specification:col:schema:all:5:0" 
    xmlns:b="urn:college:names:ws:docexchange">
  <xsl:template match="/">
    <xsl:copy-of select="b:inboundData/*[local-name()='College']/*"/>
  </xsl:template>
</xsl:stylesheet>
于 2012-11-30T23:24:20.543 に答える
4

このCollege要素は、両方のドキュメントで同じ名前空間にバインドされています。

XML ドキュメントが名前空間プレフィックスを使用するかどうか、またはそれらのプレフィックス値が異なるかどうかは関係ありません。それらは同じ名前空間にバインドされているため、XML プロセッサによって同じタイプの要素として「認識」され、XPath を介して同じ方法でアドレス指定されます。

XPath ステートメントで使用される名前空間プレフィックスは、XML ドキュメントの名前空間プレフィックスと一致する必要はありません (誰かが使用する名前空間プレフィックスを予測することは不可能であるため)。ただし、バインド先の名前空間は一致する必要があります。

どちらの XML ドキュメントも同等です。要素に namaspece-prefix があるかどうかに関係なく、要素は同じ名前空間にバインドされます。

最初の XML ドキュメントで、これらがどのように宣言され、何にマップされるかを見ると、次のようになります。

<College Version="5.0" 
 xmlns:cidx="urn:abc:names:specification:col:schema:all:5:0"
 xmlns="urn:abc:names:specification:col:schema:all:5:0">

namespace-prefix なしで名前空間が宣言されているためCollege、名前空間にバインドされている namespace-prefix なしで指定された要素を宣言します。urn:abc:names:specification:col:schema:all:5:0xmlns="urn:abc:names:specification:col:schema:all:5:0"

2 番目の例では:

<ns1:College Version="5.0" 
     xmlns:ns1="urn:abc:names:specification:col:schema:all:5:0">

Collegenamespace にバインドされた namespace-prefix を使用して名前が付けられた要素を宣言しますurn:abc:names:specification:col:schema:all:5:0

両方の例のこれらの要素の子孫要素は、最初の例の namespace-prefix の名前空間、または 2 番目の例のドキュメントの null namespace-prefix の名前空間を定義しCollegeた要素と同じ名前空間にバインドされます。Collegens1

これらの要素をアドレス指定する XSLT および XPath は、同じ結果を返す必要があります。

Collegeの子ではないため、XSLT のテンプレート マッチはどちらのドキュメントでも機能しないはずですinboundData

次のように調整する必要があります。

b:inboundData/b:Root/a:College/*

また

b:inboundData//a:College/*
于 2012-12-01T01:09:49.187 に答える