2016-08-30 8 views
0

xsl:apply-templatesをネストされた要素と一致させようとせずに、ノードとのみ一致するように制限することはできますか?XSLT apply-templateを現在のノードのみに制限しますか?

私はcall-templateを使用できることを理解しています。ここに私がこれをやろうとしている理由の詳細があります -

私はセクションとフィールドの要素で構成された文書を持っています。

セクションには、ネストされたセクション要素またはフィールド要素を含めることができます。フィールド要素にはネストはありません。例として

は、フィールドでは、テンプレートコードの抜粋である:

<xsl:template match="Field" mode="Field"> 

    <xsl:apply-templates select="." mode="FieldHeight" /> 

    ..... 

</xsl:template> 

<xsl:template match="Field[LayoutTitlePosition = 'top']" mode="FieldHeight"> 
    <xsl:attribute name="h" select="$glTopFieldHeight" /> 
</xsl:template> 

<xsl:template match="Field[LayoutTitlePosition = ('left', 'right', 'none')]" mode="FieldHeight"> 
    <xsl:attribute name="h" select="$glHorzFieldHeight" /> 
</xsl:template> 

同じことは、XSLを用いて達成することができる:選択/ XSL:文、私は、一致する検索パラメータを見つけることがよりよい場合に構文を維持しやすくなります。私は共通のFieldテンプレートを維持し、入力に基づいて特定の部分をオーバーライドすることができます。 Fieldsはネストされていないので、私は 'subFields'がマッチしていることを心配する必要はありません。

セクション見出しでも同じことをしたいのですが、セクションにテンプレートを適用すると、ネストされたセクションと一致する可能性があります。これは、タイトルが付いたサブセクションを含むセクションをテンプレートに適用すると発生します。サブセクションはタイトルが付いています。サブセクションは2回マッチします。

EDIT問題の例。

問題を再現するための最小限の例を作成しようとしました。入力文書:サブセクションのタイトルがあることが見えた

<?xml version="1.0" encoding="UTF-8"?> 
<subform layout="tb"> 
    <subform layout="tb"> 
     <subform layout="tb"> 
      <Heading>Sub section title</Heading> 
     </subform> 
     <subform layout="tb"> 
      <subform layout="tb"> 
       <Heading>Sub section title</Heading> 
      </subform> 
      <subform layout="tb"> 
       <field name=""/> 
      </subform> 
     </subform> 
    </subform> 
</subform> 

:入力文書を変換するから

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes" /> 

<xsl:template match="*" > 
    <subform layout="tb"> 
     <xsl:apply-templates select=".[name() = 'Section']" mode="Heading" /> 
     <xsl:apply-templates select=".[name() = 'Field']" mode="Field" /> 
     <xsl:apply-templates select="*[name() = ('Section', 'Field')]" /> 
    </subform> 
</xsl:template> 

<xsl:template match="Section[Title]" mode="Heading"> 
    <subform layout="tb"> 
     <xsl:call-template name="drawHeading" /> 
    </subform> 
</xsl:template> 

<xsl:template name="drawHeading"> 
    <Heading><xsl:value-of select="Title" /></Heading> 
</xsl:template> 

<xsl:template match="Field" mode="Field"> 
    <field name="{@Name}"> 
    </field> 
</xsl:template> 

出力、:

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <Section> 
     <!-- no title --> 
     <Section> 
      <Title>Sub section title</Title> 
      <Field> 
       <Type>Text</Type> 
      </Field> 
     </Section> 
    </Section> 
</Root> 

XSLはドキュメントを変換しますタイトルのない親セクションが一致しなかった場合に一致する。

私が達成したかった結果は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
<subform layout="tb"> 
    <subform layout="tb"> 

     <subform layout="tb"> 
      <subform layout="tb"> 
       <Heading>Sub section title</Heading> 
      </subform> 
      <subform layout="tb"> 
       <field name=""/> 
      </subform> 
     </subform> 
    </subform> 
</subform> 

タイトルは、ソースドキュメント、例に存在している場合:

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <Section> 
     <Title>Section title</Title> 
     <Section> 
      <Title>Sub section title</Title> 
      <Field> 
       <Type>Text</Type> 
      </Field> 
     </Section> 
    </Section> 
</Root> 

そして、それが生成する必要があります:

<?xml version="1.0" encoding="UTF-8"?> 
<subform layout="tb"> 
    <subform layout="tb"> 
     <subform layout="tb"> 
      <Heading>Section title</Heading> 
     </subform> 
     <subform layout="tb"> 
      <subform layout="tb"> 
       <Heading>Sub section title</Heading> 
      </subform> 
      <subform layout="tb"> 
       <field name=""/> 
      </subform> 
     </subform> 
    </subform> 
</subform> 
+0

入力のサンプル、必要な結果、取得したコード、結果を表示することを検討してください。私はなぜ、どうしたらいいのか理解できないのではないかと思います。 ' 'はネストされたセクションを処理します。 –

+0

私は例を追加しました – dave

+0

達成したい結果を投稿してください。 –

答えて

1

FieldTitleの2つの専用テンプレートを使用しているようですする必要があります:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes" /> 

<xsl:template match="*" > 
    <subform layout="tb"> 
     <xsl:apply-templates/> 
    </subform> 
</xsl:template> 


<xsl:template match="Title"> 
    <subform layout="tb"> 
     <Heading><xsl:value-of select="." /></Heading> 
    </subform> 
</xsl:template> 

<xsl:template match="Field"> 
    <subform layout="tb"> 
     <field name="{@Name}"></field> 
    </subform> 
</xsl:template> 

</xsl:stylesheet> 

オンラインでhttp://xsltransform.net/pPJ8LUX

関連する問題