xslt不同值不适用于属性

xslt不同值不适用于属性,xslt,Xslt,我有以下xml文件,我需要找出多个组中存在的不同属性语言数 <?xml version="1.0" encoding="UTF-8"?> <tns:DfCustomer> <tns:Date_TimeList> <tns:Date_Time index="1">1404211736</tns:Date_Time> </tns:Date_TimeList> <tns:Short_NameList>

我有以下xml文件,我需要找出多个组中存在的不同属性语言数

 <?xml version="1.0" encoding="UTF-8"?>
 <tns:DfCustomer>
<tns:Date_TimeList>
    <tns:Date_Time index="1">1404211736</tns:Date_Time>
</tns:Date_TimeList>
<tns:Short_NameList>
    <tns:Short_Name language="GB">ABC EUROPE</tns:Short_Name>
</tns:Short_NameList>
<tns:Name_1List>
    <tns:Name_1 language="GB">ABC EUROPE</tns:Name_1>
</tns:Name_1List>
<tns:Name_2List>
    <tns:Name_2 language="GB">ABC EUROPE</tns:Name_2>
</tns:Name_2List>
<tns:StreetList>
    <tns:Street language="GB">FRANKFURTER STR.107</tns:Street>
    <tns:Street language="FR">D-64807 DIEBURG</tns:Street>
</tns:StreetList>
<tns:address1List>
    <tns:address1 language="GB" index="1">Test GB Address 1</tns:address1>
    <tns:address1 language="FR" index="1">Test FR Address 1</tns:address1>
    <tns:address1 language="DE" index="1">Test DE Address 1</tns:address1>
    <tns:address1 language="GB" index="2">Test GB Address 2</tns:address1>
    <tns:address1 language="FR" index="2">Test FR Address 2</tns:address1>
    <tns:address1 language="GB" index="3">Test GB Address 3</tns:address1>
</tns:address1List>
<tns:Town_CountryList>
    <tns:Town_Country language="GB">GERMANY</tns:Town_Country>
</tns:Town_CountryList>

1404211736
ABC欧洲公司
ABC欧洲公司
ABC欧洲公司
法兰克福街107号
D-64807迪堡
测试GB地址1
测试FR地址1
测试DE地址1
测试GB地址2
测试FR地址2
测试GB地址3
德国

在上面的示例中,我有3种不同的语言,如GB、DE和FR。我希望得到计数3。我尝试使用xslt/xpath函数,但似乎没有任何效果。它在为每个循环迭代时给出堆栈溢出错误

一,


二,

<xsl:variable name="total">
    <xsl:for-each select="dfns:*/dfns:*[@language]/@language">
                    <xsl:value-of select="."/>
                </xsl:for-each>

三,


  • 尝试使用generate id和generate-key()函数,但该函数也不起作用

  • 我不确定我做错了什么。请帮帮我

    给定格式良好的输入,例如:

    XML

    <root>
       <Date_TimeList>
          <Date_Time index="1">1404211736</Date_Time>
       </Date_TimeList>
       <Short_NameList>
          <Short_Name language="GB">ABC EUROPE</Short_Name>
       </Short_NameList>
       <Name_1List>
          <Name_1 language="GB">ABC EUROPE</Name_1>
       </Name_1List>
       <Name_2List>
          <Name_2 language="GB">ABC EUROPE</Name_2>
       </Name_2List>
       <StreetList>
          <Street language="GB">FRANKFURTER STR.107</Street>
          <Street language="FR">D-64807 DIEBURG</Street>
       </StreetList>
       <address1List>
          <address1 language="GB" index="1">Test GB Address 1</address1>
          <address1 language="FR" index="1">Test FR Address 1</address1>
          <address1 language="DE" index="1">Test DE Address 1</address1>
          <address1 language="GB" index="2">Test GB Address 2</address1>
          <address1 language="FR" index="2">Test FR Address 2</address1>
          <address1 language="GB" index="3">Test GB Address 3</address1>
       </address1List>
       <Town_CountryList>
          <Town_Country language="GB">GERMANY</Town_Country>
       </Town_CountryList>
    </root>
    
    
    1404211736
    ABC欧洲公司
    ABC欧洲公司
    ABC欧洲公司
    法兰克福街107号
    D-64807迪堡
    测试GB地址1
    测试FR地址1
    测试DE地址1
    测试GB地址2
    测试FR地址2
    测试GB地址3
    德国
    
    以下样式表:

    XSLT2.0

    <xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/">
        <result>
            <xsl:value-of select="count(distinct-values(//@language))" />
        </result>
    </xsl:template>
    
    </xsl:stylesheet>
    
    
    
    将返回:

    <?xml version="1.0" encoding="UTF-8"?>
    <result>3</result>
    
    
    3.
    
    给定格式良好的输入,例如:

    XML

    <root>
       <Date_TimeList>
          <Date_Time index="1">1404211736</Date_Time>
       </Date_TimeList>
       <Short_NameList>
          <Short_Name language="GB">ABC EUROPE</Short_Name>
       </Short_NameList>
       <Name_1List>
          <Name_1 language="GB">ABC EUROPE</Name_1>
       </Name_1List>
       <Name_2List>
          <Name_2 language="GB">ABC EUROPE</Name_2>
       </Name_2List>
       <StreetList>
          <Street language="GB">FRANKFURTER STR.107</Street>
          <Street language="FR">D-64807 DIEBURG</Street>
       </StreetList>
       <address1List>
          <address1 language="GB" index="1">Test GB Address 1</address1>
          <address1 language="FR" index="1">Test FR Address 1</address1>
          <address1 language="DE" index="1">Test DE Address 1</address1>
          <address1 language="GB" index="2">Test GB Address 2</address1>
          <address1 language="FR" index="2">Test FR Address 2</address1>
          <address1 language="GB" index="3">Test GB Address 3</address1>
       </address1List>
       <Town_CountryList>
          <Town_Country language="GB">GERMANY</Town_Country>
       </Town_CountryList>
    </root>
    
    
    1404211736
    ABC欧洲公司
    ABC欧洲公司
    ABC欧洲公司
    法兰克福街107号
    D-64807迪堡
    测试GB地址1
    测试FR地址1
    测试DE地址1
    测试GB地址2
    测试FR地址2
    测试GB地址3
    德国
    
    以下样式表:

    XSLT2.0

    <xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/">
        <result>
            <xsl:value-of select="count(distinct-values(//@language))" />
        </result>
    </xsl:template>
    
    </xsl:stylesheet>
    
    
    
    将返回:

    <?xml version="1.0" encoding="UTF-8"?>
    <result>3</result>
    
    
    3.
    
    因为Nodepad++XML工具基于libxml,只支持XSLT 1.0。 您可以尝试此基于密钥的解决方案:

    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
      <xsl:key name="klanguage" match="*[@language]" use="@language"/>
    
    
      <xsl:template match="/*">
        <xsl:copy>
          <xsl:value-of select="count( //*[
            generate-id()
            = 
            generate-id(key('klanguage', @language)[1])
          ])" />
    
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    
    
    
    它使用记事本++生成以下输出:

     <?xml version="1.0" encoding="UTF-8"?>
     <root>3</root>
    
    
    3.
    

    基于:

    因为Nodepad++XML工具基于libxml,它只支持XSLT1.0。 您可以尝试此基于密钥的解决方案:

    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
      <xsl:key name="klanguage" match="*[@language]" use="@language"/>
    
    
      <xsl:template match="/*">
        <xsl:copy>
          <xsl:value-of select="count( //*[
            generate-id()
            = 
            generate-id(key('klanguage', @language)[1])
          ])" />
    
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    
    
    
    它使用记事本++生成以下输出:

     <?xml version="1.0" encoding="UTF-8"?>
     <root>3</root>
    
    
    3.
    

    基于:

    请发布一个格式良好的XML输入示例。--你想考虑整个XML文档中的所有@语言属性吗?我想考虑XML FielWew中的所有语言属性,然后我的答案应该为您工作。请发布一个格式良好的XML输入示例。你想考虑整个XML文档中的所有@语言属性吗?我想考虑XML语言中的所有语言属性,然后我的答案应该为你工作。在记事本+编辑器中尝试你的代码,得到结果迈克不认为这是一个XSLT 2处理器,是吗?是的。XSLT 1.0处理器找不到函数不同的值。它会在Notepad++编辑器中抛出NPETried代码,结果为空。我不认为这是XSLT2.0处理器,是吗?是的,Mike。XSLT 1.0处理器找不到函数不同的值。它抛出NPEyour示例运行良好,正如您所说,是XSLT版本的问题导致了它。然而,如果我在我的大XSLT中复制相同的行,它不会给我正确的结果。它甚至没有进入xsl:template match=“/”中。。不知道怎么了。。我在想办法。谢谢你的帮助!!您的示例运行良好,正如您所说,是XSLT版本的问题导致了它。然而,如果我在我的大XSLT中复制相同的行,它不会给我正确的结果。它甚至没有进入xsl:template match=“/”中。。不知道怎么了。。我在想办法。谢谢你的帮助!!