【问题标题】:Get distinct node values in XML with XSL使用 XSL 在 XML 中获取不同的节点值
【发布时间】:2010-08-04 21:32:31
【问题描述】:

如何使用 XSL 在我的 XML 中找到所有不同的名称?

<NewDataSet>
  <SearchResult>
    <Name>HAREDIN </Name>
    <Surname>FEIMI</Surname>
    <FathersName>QAMIL</FathersName>
    <Birthdate>1949-06-13T00:00:00+02:00</Birthdate>
    <CustomerSegment>Individe Standart </CustomerSegment>
  </SearchResult>
  <SearchResult>
    <Name>HARMENAK</Name>
    <Surname>BADEJAN</Surname>
    <FathersName>VARAHAN  </FathersName>
    <Birthdate>1943-10-02T00:00:00+02:00</Birthdate>
    <CustomerSegment>Individe Standart </CustomerSegment>
  </SearchResult>
   <SearchResult>
    <Name>HARMENAK</Name>
    <Surname>BADEJAN</Surname>
    <FathersName>VARAHAN  </FathersName>
    <Birthdate>1943-10-02T00:00:00+02:00</Birthdate>
    <CustomerSegment>Individe Standart </CustomerSegment>
  </SearchResult>
</NewDataSet>

我不会所有不同的名称节点,输出像这样:

<root>

<Name>HAREDIN </Name>

<Name>HARMENAK</Name>

</root>

【问题讨论】:

  • 请显示您目前拥有的 XSL 代码。即使在此站点上,也有无数通用“在 XSL 中获取不同值”解决方案的示例。肯定足以让你开始。 stackoverflow.com/search?q=[xslt]+distinct
  • 您可以发布所需输出的示例吗?
  • 输出:HARMENAKHAREDIN
  • 干得好,你找到了一个为你做了所有思考和所有工作的人。

标签: xml xslt


【解决方案1】:

这个 XSLT 1.0 转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kNamesByVal" match="Name" use="."/>

 <xsl:template match="/">
  <t>
    <xsl:copy-of select=
    "*/*/Name[generate-id()
             =
              generate-id(key('kNamesByVal', .)[1])
              ]
    "/>
  </t>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时,会产生所需的正确结果:

<t>
   <Name>HAREDIN </Name>
   <Name>HARMENAK</Name>
</t>

不使用密钥的 XSLT 2.0 解决方案:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>  

 <xsl:template match="/">
  <t>
   <xsl:for-each-group select="*/*/Name" group-by=".">
     <xsl:copy-of select="."/>
   </xsl:for-each-group>
  </t>
 </xsl:template>
</xsl:stylesheet>

【讨论】:

  • 假设你想在输出前加上数字前缀来表示它们是什么。例如:“#1 - Haredin”然后是“#2 - Harmenak”。你知道如何在 XSLT 1.0 中做到这一点吗?
  • @NessDan,了解 XPath 函数 position()
  • 我调查了它,但在您的示例中没有得到准确的位置。我项目中的实际唯一节点相距甚远,因此我希望 position() 返回 1 和 4 之类的内容(因为这是唯一节点之间的距离。)
  • @NessDan,这意味着您仍然不了解position() 的工作原理。这是一个 context-dependent 函数,因此它不依赖于两个节点之间的实际“距离”。
  • 啊,感谢您的澄清。等我回去工作再试试。
猜你喜欢
  • 2012-08-03
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多