2009-07-08 16 views
0

this fileをソースとして使用すると、ローカルソースファイルまたはインポートに記載されている関連ソースファイルから要素を取得する必要があります。タイプ値はコロンを使用して2つの値を区切ります。-substring-before(@type、 ':')はどのファイルを参照するかを教えます。 substring-after(@type、 ':')は、コピーする必要のあるファイル内の要素の名前です。&は同じ方法でその内容を繰り返します。XSLT:Copy現在の型の値が要素の名前と等しい場合

例:名前が "PersonType"のxs:complexTypeが必要なので、copy-ofを使用してその子とその子を取得します。次のステップは、それらの子どもを見ることです - xs:elementであるものについては、タイプ値( "AcRec:HighSchoolType")で参照されている要素を取得します。 "AcRec"はどのxsdを使用する必要があるかを教えてくれるので、名前値が "HighSchoolType"のxsdで何かを見つけるでしょう。 AcRec xsdを見ると、 "HighSchoolType"はxs:complexType(私は既にテンプレートで処理するように定義されています)であることがわかりますので、出力を確認してください。私は私が正常にXSLを入力すると、ドキュメント内の探してについて何をしないのです

<xs:complexType name="PersonType"> 
    <xs:sequence> 
    <xs:element name="HighSchool" type="AcRec:HighSchoolType" minOccurs="0"> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="HighSchoolType"> 
    <xs:sequence> 
    <xs:element name="OrganizationName" type="core:OrganizationNameType"/> 
    <xs:group ref="core:OrganizationIDGroup" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 

:とき

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:template match="/"> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:core="urn:org:pesc:core:CoreMain:v1.2.0" xmlns:AcRec="urn:org:pesc:sector:AcademicRecord:v1.1.0"> 
    <xsl:apply-templates select="//xs:complexType[@name='PersonType']" />  
</xs:schema> 
</xsl:template> 

<xsl:template match="xs:complexType"> 
    <xsl:copy> 
     <xsl:copy-of select="node()[not(xs:annotation | xs:restriction)]|@*"/> 
    </xsl:copy> 
    <xsl:apply-templates select=".//xs:element" /> 
</xsl:template> 

<xsl:template match="xs:simpleType"> 
    <xsl:copy> 
     <xsl:copy-of select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="xs:element"> 
    <xsl:choose> 
     <xsl:when test="substring-before(@type, ':') = 'AcRec'"> 
      <xsl:text>AcRec</xsl:text> 
      <xsl:apply-templates select="document('[local file path]AcademicRecord_v1.3.0.xsd')//*[@name=substring-after(@type, ':')]" /> 
     </xsl:when>      
    </xsl:choose> 
</xsl:template> 

所望の出力は次のようになりますか? xsl:textは私が入っていると伝えますが、後続の行は出力を返しません。

さらに、xs:complextType & xs:simpleType要素をコピーするときに、xs:annotationとxs:restriction要素が表示されないようにするにはどうすればよいですか?私はdpawsonサイトで言及された例を動作させることができませんでした。

答えて

0

問題があった。

<xsl:apply-templates select="document('[local file path]AcademicRecord_v1.3.0.xsd')//*[@name=substring-after(@type, ':')]" /> 

...する必要があります: - :何が起こることはそのXPath式の処理に関与コンテキストスイッチがあることがある

<element name="text" type="some:text"/> 

<xsl:variable name="name" select="substring-after(@type, ':')" /> 
<xsl:apply-templates select="document('[local file path]AcademicRecord_v1.3.0.xsd')//*[@name=$name]" /> 

ScottSEAあなたはそれがに基づいて比較して言ったとき、あなたは正しかったです。 // * [@ name = substring-after(@type、 ':')]と言うときは、「参照されるXSDドキュメントの要素にこのテンプレートを適用し、@name属性と@type属性の両方を持つ、その@nameがsubstring-afterの後ろの ':@'と同じですが、変数を使用する場合は、もちろん現在のドキュメントから部分文字列を取得します。

0

私は、あなたの質問が本当に理解するのが難しいと言わざるを得ない。あなたはもう少しそれを壊すことができますか?

一方、限りXS除くとして:注釈およびxs:制限要素を、ちょうどそれらを除外するためにあなたのコピーのステートメントを変更します。

<xsl:copy-of select="node()[not(self::xs:annotation or self::xs:restriction)]|@*"/> 

を...そしてあなたがXSLを持っている:を選択してくださいなしのxsl:要素の場合:

<xsl:template match="xs:element"> 
    <xsl:if test="substring-before(@type, ':') = 'AcRec'"> 
    <xsl:text>AcRec</xsl:text> 
     <xsl:apply-templates select="document('[local file path]AcademicRecord_v1.3.0.xsd')//*[@name=substring-after(@type, ':')]" /> 
    </xsl:if> 
</xsl:template> 
そう ...あなたが XSLでこれを簡素化することができる唯一のXSLを持つ要素

さらに反映されると、select文が不正である可能性があります:現在、コロンの後のtype属性に一致するname属性を持つ要素と一致するようにしようとしています。したがって、一致する必要があります

このような要素がない場合、一致が空であり、テンプレートは実行されません。

+0

例を含めるように投稿を更新しました - あなたが示唆した除外事項で幸運がありませんでした - アノテーション/制限要素に関連付けられた子どもがいるかどうかは重要ですか? –

+0

私はsome.xsdを使用して要素名を探すことを知っていたので、現在の "some"のさまざまなインスタンスをキャッチするようにCHOOSEを解釈しました。 "

+0

ええと...私は注釈の自己::軸を忘れてしまった/制限セグメント。適切に改訂されました。 –

関連する問題