是否可以在同一个XSLT样式表中预处理xml源?

时间:2015-06-16 05:54:29

标签: xslt xslt-2.0

在同一个XSLT(2.0)样式表和转换中,我想:

1) first preprocess the whole XML Datasource (Add a attribute 
    with a specific  calculation to certain elements) 

然后

2: transform the changed XML Datasource with the sylesheet's templates.

我怎样才能做到这一点?一个代码示例会很好吗?

1 个答案:

答案 0 :(得分:2)

是的,这是可能的。一种可能性是按如下方式进行:

<xsl:template match="/">
    <!-- store the modified content in a variable -->
    <xsl:variable name="preprocessed.doc">
        <xsl:apply-templates mode="preprocess" />
    </xsl:variable>

    <!-- process the modified contents -->
    <xsl:apply-templates select="$preprocessed.doc/*" />
</xsl:template>

<!-- first pass: sample process to add an attribute named "q" -->
<xsl:template match="*" mode="preprocess">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:attribute name="q"><xsl:number count="*" level="any" /></xsl:attribute>
        <xsl:apply-templates mode="preprocess" />
    </xsl:copy>
</xsl:template>

<!-- "normal" processing of the modified content. It is able to used the newly processed attribute. -->

<xsl:template match="*[@q &lt;= 5]">
    <xsl:copy>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

<xsl:template match="*"/>
  1. 在第一遍中,添加了一个属性,计算输入XML中的元素。
  2. 在处理过程中,我们只保留q属性值设置数小于或等于5的元素。