我在使用XSLT 1.0获取Unique列表时遇到了一个典型问题。
示例XSLT:
<xsl:if test="$tempVar = 'true'">
<xsl:variable name="filePath" select="document($mPath)" />
// Do something
// I can't implement this using "Muenchian Method".
// Since, I can't declare <xsl:key> inside of <xsl:if>
// There is no chance to declare <xsl:key> on top.
// I should get unique list from here only
</xsl:if>
filepath 变量将包含XML,如下所示: -
<Root>
<Data id="102">
<SubData>
<Info code="abc">Information 102</Info>
</SubData>
</Data>
<Data id="78">
<SubData>
<Info code="def">Information 78</Info>
</SubData>
</Data>
<Data id="34">
<SubData>
<Info code="abc">Information 34</Info>
</SubData>
</Data>
<Data id="55">
<SubData>
<Info code="xyz">Information 55</Info>
</SubData>
</Data>
<Data id="86">
<SubData>
<Info code="def">Information 86</Info>
</SubData>
</Data>
<Data id="100">
<SubData>
<Info code="xyz">Information 100</Info>
</SubData>
</Data>
</Root>
输出:代码的唯一列表应为
abc
def
xyz
由于
答案 0 :(得分:2)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="//Data[
not(
*/Info/@code = preceding-sibling::Data/*/Info/@code
)
]/*/Info/@code"/>
</xsl:template>
<xsl:template match="@*">
<xsl:value-of select="."/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
<xsl:if test="$tempVar = 'true'"> <xsl:variable name="filePath" select="document($mPath)" /> // Do something // I can't implement this using "Muenchian Method". // Since, I can't declare <xsl:key> inside of <xsl:if> // There is no chance to declare <xsl:key> on top. // I should get unique list from here only </xsl:if>
在这种情况下,不能使用<xsl:key>
和key()
功能:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kcodeByVal" match="@code" use="."/>
<xsl:variable name="tempVar" select="'true'"/>
<xsl:variable name="vrtfFilePath">
<Root>
<Data id="102">
<SubData>
<Info code="abc">Information 102</Info>
</SubData>
</Data>
<Data id="78">
<SubData>
<Info code="def">Information 78</Info>
</SubData>
</Data>
<Data id="34">
<SubData>
<Info code="abc">Information 34</Info>
</SubData>
</Data>
<Data id="55">
<SubData>
<Info code="xyz">Information 55</Info>
</SubData>
</Data>
<Data id="86">
<SubData>
<Info code="def">Information 86</Info>
</SubData>
</Data>
<Data id="100">
<SubData>
<Info code="xyz">Information 100</Info>
</SubData>
</Data>
</Root>
</xsl:variable>
<xsl:variable name="vfilePath"
select="ext:node-set($vrtfFilePath)"/>
<xsl:template match="/">
<xsl:if test="$tempVar = 'true'">
<xsl:for-each select="$vfilePath">
<xsl:for-each select=
"*/*/*/Info/@code
[generate-id()
=
generate-id(key('kcodeByVal',.)[1])
]
">
<xsl:value-of select="concat(.,' ')"/>
</xsl:for-each>
</xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
将此转换应用于任何XML文档(本示例中未使用)时,会生成所需的正确结果:
abc def xyz
答案 2 :(得分:1)
您不使用Muenchian方法或xsl:key的原因是虚假的。它会很好地工作。您可能无法理解,当您声明一个键定义时,它并不特定于一个特定的源文档,它允许您对任何源文档使用key()函数。