为我正在处理的树中的节点分配值

时间:2012-01-01 00:39:13

标签: xslt xpath

使用XSLT 1.0,我想按顺序处理四个节点集,A,B,C,D。但我不能用单个(或至少不可管理的)XPath表达式指定每个节点集。

我想,在前面,扫描并标记我想要成为A的所有节点,我想要成为B的所有节点等等,然后能够随意选择所有A节点,所有B节点等

我也可能希望稍后添加到列表中。

我无法在我正在处理的文件中创建属性。 (对吗?)变量太快超出范围。也许使用键的东西?所有A的钥匙,都是B的?但是,一旦创建了密钥,我可以在密钥表中添加更多节点吗?

或者有没有办法保存XPath?

有没有一种简单的方法可以做到这一点,或者每次我想要选择每个节点集时,我是否只需创建一个讨厌的,可怕的,容易出错的,难以维护的Xpath表达式?

1 个答案:

答案 0 :(得分:0)

解决方案:使用全局变量,如下所示:

<xsl:variable name="A" select="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title" />
<xsl:variable name="B" select="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:author" />
<xsl:variable name="C" select="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:sponsor    | 
                               //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:funder     | 
                               //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:principal  | 
                               //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:respStmt   |
                               //tei:teiHeader/tei:fileDesc/tei:editionStmt              |
                               //tei:teiHeader/tei:fileDesc/tei:extent                   |
                               //tei:teiHeader/tei:fileDesc/tei:seriesStmt" />
<xsl:variable name="D" select="//tei:teiHeader/tei:fileDesc/tei:notesStmt/tei:note" />

然后:

<xsl:call-template name="writeMetadata">
   <xsl:with-param name="rowitems" select="$A" /> 
</xsl:call-template>
<xsl:call-template name="writeMetadata">
   <xsl:with-param name="rowitems" select="$B" /> 
</xsl:call-template>
<xsl:call-template name="writeMetadata">
   <xsl:with-param name="rowitems" select="$C" /> 
</xsl:call-template>
<xsl:call-template name="writeMetadata">
   <xsl:with-param name="rowitems" select="$D" /> 
</xsl:call-template>

根据需要重复,无需重复Xpath表达式。

(Michael,你的评论“人们经常没有意识到全局变量定义可以引用源文档,”在dpawson.co.uk上发布,让我找到了正确的区域。)