1

ID テンプレートと、ソース内の潜在的な XPath に一致するいくつかのテンプレートを使用して、XSLT を作成しました。ただし、一致するパスが常に存在するとは限りません。一致するテンプレートが適用される前にパスを「挿入」する方法はありますか? XSLT は手続き的に実行されないことを知っているので、これを行う方法がわかりませんでした。以下に例を示します。

これが XSLT だとしましょう:

<xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:if>
</xsl:template>

<xsl:template match='pathA'>
   do stuff
</xsl:template>

<xsl:template match='pathB'>
  do something
</xsl:template>

<xsl:template match='pathC'>
   do other stuff
</xsl:template>

そして、入力でこれを言いましょう:

<root>
    <Child>
        <pathA>I have Data!</pathA>
        <pathC>We skipped B!</pathC>
    </Child>
</root>

pathBXPath に一致するテンプレートを実行できるように「作成」する方法はありますか?

ご協力いただきありがとうございます。

4

1 に答える 1

1

良いもの。どうですか...

<xsl:template name="pathB">
    <xsl:param name="nodes"/>
    do something 
</xsl:template>


<xsl:template match="Child">
    <xsl:copy>
        <xsl:apply-templates select="@* | pathA[not(../pathB)] | pathB/preceding-sibling::node()"/>
    </xsl:copy>

   <xsl:call-template name="pathB">
       <!-- pass the set of elements of type "pathB", possibly an empty nodeset -->
       <xsl:with-param name="nodes" select="pathB"/>
   </xsl:call-template>

    <xsl:copy>
        <xsl:apply-templates select="node()[not(self::pathA) and not(../pathB)] | pathB/following-sibling::node()"/>
    </xsl:copy>
<xsl:template>
于 2013-02-26T05:27:31.387 に答える