Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 使用XSLT1.0获取唯一值(不使用XSL:Key)_Xml_Xslt_Xpath_Xslt 1.0 - Fatal编程技术网

Xml 使用XSLT1.0获取唯一值(不使用XSL:Key)

Xml 使用XSLT1.0获取唯一值(不使用XSL:Key),xml,xslt,xpath,xslt-1.0,Xml,Xslt,Xpath,Xslt 1.0,在使用XSLT1.0获取唯一列表时,我遇到了一个典型的问题 示例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 decl

在使用XSLT1.0获取唯一列表时,我遇到了一个典型的问题

示例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>
谢谢


您不使用Muenchian方法或xsl:key的理由是虚假的。它会很好地工作。您可能没有理解,当您声明密钥定义时,它不是特定于某个源文档的,它允许您对任何源文档使用key()函数。

您不使用Muenchian方法或xsl:key的原因是虚假的。它会很好地工作。您可能没有理解,当您声明一个键定义时,它不是特定于一个特定的源文档的,它允许您对任何源文档使用key()函数

将此转换应用于任何XML文档(本例中未使用)时,将生成所需的正确结果

<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>
abc def xyz 
将此转换应用于任何XML文档(本例中未使用)时,将生成所需的正确结果

<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>
abc def xyz 

如果我没有错的话,我们不能在里面申报。因为我在if条件中获取xml(即文档)。如果有,请建议。如果我没有错,我们不能在里面申报。因为我在if条件中获取xml(即文档)。如果有的话,请提出建议。你声称钥匙和木琴组合不能用在你的案件中——这根本不是真的。您现在将学习如何进行此操作。:)+1问:)你声称密钥和Muenchian分组不能用在你的案例中——这根本不是真的。您现在将学习如何进行此操作。:)+1问:)嗨,迪米特里,我也在等你的解决方案。你终于发帖了。谢谢你。我有一个小小的疑问:-
在这一点上,LOC到底在做什么?请解释一下。注意:就我的例子而言,XML并没有应用于整个XSLT。XML仅在IF条件下作为文档获取。@SivaCharan:An
只能是全局指令——这并不意味着它不能被
key()
函数引用到代码中的任何地方,无论是否在条件指令中@迈克尔·凯说得对,你需要阅读钥匙的知识,需要理解它们。现在你还没有这种知识和理解,任何答案的主要优点都必须是让你意识到这一事实。因为,如果没有这些必要的知识,您甚至无法理解使用键的任何解决方案。@SivaCharan:特别是,指令:
定义键(索引),给它一个名称,指定要索引的节点(
@code
)以及应该用作索引的节点(键)value——本例中匹配节点的字符串值。这只是一个定义——它不会导致任何索引,直到
key()
函数引用这个特定的键。只有这样,索引才能在当前文档上完成。请阅读一本好的XSLT书籍。这太完美了。迪米特成功了。非常感谢您的详细解释……嗨,迪米特里,我也在等您的解决方案。你终于发帖了。谢谢你。我有一个小小的疑问:-
在这一点上,LOC到底在做什么?请解释一下。注意:就我的例子而言,XML并没有应用于整个XSLT。XML仅在IF条件下作为文档获取。@SivaCharan:An
只能是全局指令——这并不意味着它不能被
key()
函数引用到代码中的任何地方,无论是否在条件指令中@迈克尔·凯说得对,你需要阅读钥匙的知识,需要理解它们。现在你还没有这种知识和理解,任何答案的主要优点都必须是让你意识到这一事实。因为,如果没有这些必要的知识,您甚至无法理解使用键的任何解决方案。@SivaCharan:特别是,指令:
定义键(索引),给它一个名称,指定要索引的节点(
@code
)以及应该用作索引的节点(键)value——本例中匹配节点的字符串值。这只是一个定义——它不会导致任何索引,直到
key()
函数引用这个特定的键。只有这样,索引才能在当前文档上完成。请阅读一本好的XSLT书籍。这太完美了。迪米特成功了。非常感谢你的详细解释……谢谢基里尔。。这也是可行的。但我将使用Dimitre解决方案+谢谢你的回答。谢谢基里尔。。这也是可行的。但我将使用Dimitre解决方案+回答得好。
<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>
abc def xyz