使用XSLT 1.0,我想按顺序处理四个节点集,A,B,C,D。但我不能用单个(或至少不可管理的)XPath表达式指定每个节点集。
我想,在前面,扫描并标记我想要成为A的所有节点,我想要成为B的所有节点等等,然后能够随意选择所有A节点,所有B节点等
我也可能希望稍后添加到列表中。
我无法在我正在处理的文件中创建属性。 (对吗?)变量太快超出范围。也许使用键的东西?所有A的钥匙,都是B的?但是,一旦创建了密钥,我可以在密钥表中添加更多节点吗?
或者有没有办法保存XPath?
有没有一种简单的方法可以做到这一点,或者每次我想要选择每个节点集时,我是否只需创建一个讨厌的,可怕的,容易出错的,难以维护的Xpath表达式?
答案 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上发布,让我找到了正确的区域。)