スキーマで定義されているように、タイプに基づいて要素のリストを並べ替えています。XSLTが特定のスキーマに対して検証できることは知っていますが、実行する前に、操作(この場合はコピー)が有効であることを確認する必要があります。
簡略化されたコード:
着信データ:
<?xml version="1.0"?>
<sch:foo xmlns:sch="http://www.whatever.com/schema">
<sch:attr1>val1</sch:attr1>
<sch:attr2>val2</sch:attr2>
<sch:attr3>val3</sch:attr3>
<sch:attr4>val4</sch:attr4>
</sch:foo>
必要な送信データ:
<?xml version="1.0"?>
<sch:fooOut xmlns:sch="http://www.whatever.com/schema">
<sch:bar>
<sch:attr1>val1</sch:attr1>
<sch:attr2>val2</sch:attr2>
</sch:bar>
<sch:stuff>
<sch:attr3>val3</sch:attr3>
<sch:attr4>val4</sch:attr4>
</sch:stuff>
</sch:fooOut>
スキーマファイルのどこか:
<complexType name="fooOut">
<sequence>
<!-- ... -->
<element name="bar">
<complexType>
<sequence>
<element name="attr1" type="sch:myBarType" minOccurs="0" maxOccurs="unbounded"/>
<element name="attr2" type="sch:myBarType" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<element name="stuff">
<complexType>
<sequence>
<element name="attr3" type="sch:myStuffType" minOccurs="0" maxOccurs="unbounded"/>
<element name="attr4" type="sch:myStuffType" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
(私は.xsdの操作方法を学んでいるだけなので、言葉で言うと、とだけで入ることができ、attr1
とだけで入ることができます)attr2
bar
attr3
attr4
stuff
基本的に、実際の状況では、タグが多すぎて手動で適切に分離できません。スキーマをチェックして、要素を並べ替える必要のあるタイプに要素が適切かどうかを確認する方法があるかどうかを知りたいのですが。それらが1つのカテゴリに属している場合は、そのカテゴリだけに移動する必要があります。
すべての助けに感謝し、感謝します!
編集
@Alejandroのコードは、上記の基本的な擬似コードで機能しますが、より複雑なファイルに実装するのに問題があります。そのため、より複雑な例を追加します。
着信データ
<?xml version="1.0"?>
<sch:foo xmlns:sch="http://www.whatever.com/schema">
<sch:nesting>
<sch:myGroup>
<sch:mustHaveData>asdf</sch:mustHaveData>
<sch:attr1>val1</sch:attr1>
<sch:attr2>val2</sch:attr2>
<sch:attr3>val3</sch:attr3>
<sch:attr4>val4</sch:attr4>
</sch:myGroup>
<sch:myGroup>
<sch:mustHaveData>asdf2</sch:mustHaveData>
<sch:attr1>val5</sch:attr1>
<sch:attr2>val6</sch:attr2>
<sch:attr3>val7</sch:attr3>
<sch:attr4>val8</sch:attr4>
</sch:myGroup>
</sch:nesting>
</sch:foo>
必要な送信データ:
<?xml version="1.0"?>
<sch:fooOut xmlns:sch="http://www.whatever.com/schema">
<sch:anotherGroup>
<sch:name>foobar</sch:name>
<sch:bar>
<sch:attr1>val1</sch:attr1>
<sch:attr2>val2</sch:attr2>
</sch:bar>
<sch:stuff>
<sch:attr3>val3</sch:attr3>
<sch:attr4>val4</sch:attr4>
</sch:stuff>
</sch:anotherGroup>
<sch:anotherGroup>
<sch:name>foobar</sch:name>
<sch:bar>
<sch:attr1>val5</sch:attr1>
<sch:attr2>val6</sch:attr2>
</sch:bar>
<sch:stuff>
<sch:attr3>val7</sch:attr3>
<sch:attr4>val8</sch:attr4>
</sch:stuff>
</sch:anotherGroup>
</sch:fooOut>
スキーマファイルのどこか:(そして前回よりもいくらか正確です)
<complexType name="anotherGroup">
<sequence>
<element name="name" type="xs:string" minOccurs="1" maxOccurs="1" />
<element name="bar" type="barListType" minOccurs="0" maxOccurs="1" />
<element name="stuff" type="stuffListType" minOccurs="0" maxOccurs="1" />
</sequence>
</complexType>
<!-- in another .xsd -->
<complexType name="barListType">
<group ref="barGroup" maxOccurs="unbounded" />
</complexType>
<complexType name="stuffListType">
<group ref="stuffGroup" maxOccurs="unbounded" />
</complexType>
<!-- in yet another .xsd -->
<group name="barGroup">
<choice>
<element name="attr1" type="blah1" minOccurs="0" maxOccurs="1" />
<element name="attr2" type="blah2" minOccurs="0" maxOccurs="1" />
<!-- etc -->
</choice>
</group>
<group name ="stuffGroup">
<choice>
<element name="attr3" type="blah3" minOccurs="0" maxOccurs="1" />
<element name="attr4" type="blah4" minOccurs="0" maxOccurs="1" />
<!-- etc -->
</choice>
</group>
最後に、私のxslファイル
<xsl:output method="xml" encoding="UTF-8" />
<xsl:param name="schema-name" select="'myXsd.xsd'" />
<xsl:template match="/">
<xsl:apply-templates select="document($schema-name)/xs:complexType[@*]" />
<xsl:apply-templates select="sch:nesting"/>
</xsl:template>
<xsl:template match="sch:nesting/xs:element[xs:complexType]">
<xsl:element name="{@name}" namespace="http://www.whatever.com/schema">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="sch:nesting/xs:element[not(xs:complexType)]">
<xsl:element name="{@name}" namespace="http://www.whatever.com/schema">
<xsl:value-of select="/*/sch:*[name()=current()/@name or
substring-after(name(),':')=current()/@name]"/>
</xsl:element>
</xsl:template>
<xsl:template match="sch:nesting">
<xsl:element name="anotherGroup">
<xsl:element name="name">
<!-- Whatever -->
</xsl:element>
<xsl:apply-templates /> <!-- I want to drop the data here, but this is definitely wrong -->
</xsl:element>
</xsl:template>
</xsl:stylesheet>
助けてくれてありがとう!
編集2
そのため、データファイルについて忘れていた小さな変更が1つあります。次のようにネストされているレイアウトを除いて、他のすべては同じである必要があります。
<?xml version="1.0"?>
<sch:foo xmlns:sch="http://www.whatever.com/schema">
<sch:nesting>
<sch:myGroup>
<inner1>
<sch:mustHaveData>asdf</sch:mustHaveData>
<sch:attr1>val1</sch:attr1>
</inner1>
<inner2>
<sch:attr2>val2</sch:attr2>
<sch:attr3>val3</sch:attr3>
<sch:attr4>val4</sch:attr4>
</inner2>
</sch:myGroup>
<sch:myGroup>
<inner1>
<sch:mustHaveData>asdf2</sch:mustHaveData>
<sch:attr1>val5</sch:attr1>
</inner1>
<inner2>
<sch:attr2>val6</sch:attr2>
<sch:attr3>val7</sch:attr3>
<sch:attr4>val8</sch:attr4>
</inner2>
</sch:myGroup>
</sch:nesting>
</sch:foo>
ここで説明しようとしているのは、グループ内にはサブカテゴリがあり、それらのサブカテゴリ内のすべてを一致させる必要があるということです。
アレハンドロ、これをあなたの価値のあるものにするために(あなたはとても素晴らしい助けをしてくれたので)、あなたはあなたの応答を新しい答えに入れるべきです、そして私がそれを試してそれを機能させるとき、私はその答えに賛成票を投じて受け入れます。
再度、感謝します!あなたは本当に命の恩人です!
編集3
私は望ましい結果を見つけました。私は言った行を変更しました
<xsl:copy-of select="*[local-name()=document($schema-name)/*/*
に
<xsl:copy-of select="*/*[local-name()=document($schema-name)/*/*
それは私に必要な余分なビットを与えました。