快速问题:有没有办法通过使用变量来增加 XPATH 的谓词,比如在 C 中遍历数组?例如 /XPATH/element[i]
我正在尝试使用 XSL 使用 XPATHS 从 XML 访问数据。XML 是数据库的输出,其中父节点是表名,其子节点是列。XSL 必须能够将子项的文本值转换为具有表名元素的列名的属性。
我要解决的问题是每个表可以有多个行,这些行作为同名的兄弟节点输出到 XML。任何表中都可能有无限行,因此我尝试使用带有表名 XPATH 的 for-each 来处理每一行。这可行,但是当我尝试将文档函数与 XPATH 一起使用时,带有谓词到第一个 XPATH,然后是下一个 XPATH,然后是下一个,我不知道该怎么做。我只能访问第一个 XPATH。我想要一种能够在 for-each 的每次迭代中访问下一个 XPATH 的方法。有什么东西可以增加每个循环以及谓词和用来指向下一个 XPATH 的东西吗?
下面的 XML 代码是我用于测试的示例,它被称为 DB.xml:
<?xml version="1.0"?>
<dataset>
<rtbp>
<cfmtype>dog</cfmtype>
<cfmid>1</cfmid>
</rtbp>
<rtbp>
<cfmtype>cat</cfmtype>
<cfmid>2</cfmid>
</rtbp>
<FunctionSet>
<FUNCTIONSET__IDENTIFIER>1</FUNCTIONSET__IDENTIFIER>
<RTBP__CFMID>1</RTBP__CFMID>
</FunctionSet>
<FunctionSet>
<FUNCTIONSET__IDENTIFIER>2</FUNCTIONSET__IDENTIFIER>
<RTBP__CFMID>2</RTBP__CFMID>
</FunctionSet>
</dataset>
下面是我正在使用的 XSL:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="dataset/rtbp">
<xsl:element name="RTBP">
<xsl:attribute name="CFMtype">
<xsl:value-of select="document('DB.xml')/dataset/rtbp[1]/cfmtype" />
</xsl:attribute>
<xsl:attribute name="CFMid">
<xsl:value-of select="document('DB.xml')/dataset/rtbp[1]/cfmid" />
</xsl:attribute>
<xsl:text>
</xsl:text>
<xsl:for-each select="/dataset/FunctionSet">
<xsl:element name="FunctionSet">
<xsl:attribute name="RTBP__CFMid">
<xsl:value-of select="document('DB.xml')/dataset/FunctionSet[1]/FUNCTIONSET__IDENTIFIER" />
</xsl:attribute>
<xsl:attribute name="RTBP_FunctionSet">
<xsl:value-of select="document('DB.xml')/dataset/FunctionSet[1]/RTBP__CFMID" />
</xsl:attribute>
</xsl:element>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:element>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
谓词目前设置为 1,但我希望它是一个在每个循环上迭代的变量,以便 XPATH 更改为下一次出现的表名。
预期结果如下:
<?xml version="1.0"?>
<RTBP CFMtype="dog" CFMid="1">
<FunctionSet RTBP__CFMid="1" RTBP_FunctionSet="1"/>
</RTBP>
<RTBP CFMtype="cat" CFMid="2">
<FunctionSet RTBP__CFMid="2" RTBP_FunctionSet="2"/>
</RTBP>
正如您可能知道的那样,第二个表(FunctionSet)是第一个表(RTBP)的子表,因此 for-each 在 for-each 中。我需要一种方法,将 FunctionSet 的第一行放入 RTBP 的第一行,第二行也是如此。
我是 XML、XSL 和发布问题的新手。