如何提取节点名称而不加倍

时间:2019-08-02 16:33:05

标签: xslt

我想知道是否有一个xsl代码可以循环遍历xml文件并仅提取节点名称。另外还要确保它不会写两次。

这是针对我在客户方的项目。我需要将xml转换为文本,并且正在使用groovy和xslt进行此操作。由于xml文件很大,因此花很多时间才能遍历xml文件以查找不同的“价值抵免”。

我已经有了这个,但是它给了我所有的节点及其值,所以每个节点不止一次

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
    <xsl:apply-templates select="/currencies/record"></xsl:apply-templates>
</xsl:template>
<xsl:key name="names" match="*|@*" use="name()"/>

<xsl:template match="/currencies/record">
      <xsl:for-each select="//*">
            <xsl:value-of select="local-name()"/>=<xsl:apply-templates select="current()/text()"/>
            <xsl:text>&#xa;</xsl:text>
        </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

xml看起来像这样:

<record deprecated="false"
           id="CUR00001"
           date.creation="2010-03-22"
           adm.status="current">
      <authority-code>AED</authority-code>
      <code-4217>AED</code-4217>
      <label>
         <lg.version lg="bul" script="Cyrillic">Дирхам на ОАЕ</lg.version>
         <lg.version lg="ces">UAE dirham n. emirátský dirham</lg.version>
         <lg.version lg="dan">Emiratarabisk dirham</lg.version>
         <lg.version lg="deu" gender.grammar="M">VAE-Dirham</lg.version>
         <lg.version lg="deu" number.grammar="P">VAE-Dirhams</lg.version>
         <lg.version lg="fin">Arabiemiirikuntien dirhami</lg.version>
         <lg.version lg="fra" gender.grammar="M">Dirham des Émirats arabes unis</lg.version>
         ...
      </label>
      <currency.subunit>
         <lg.version lg="bul" script="Cyrillic">филс</lg.version>
         <lg.version lg="ces">fils</lg.version>
         <lg.version lg="dan">fils</lg.version>
         <lg.version lg="deu" gender.grammar="M">Fils</lg.version>
         <lg.version lg="ell" script="Greek">φιλς</lg.version>
         <lg.version lg="eng" gender.grammar="N">fils</lg.version>
         ...
      <start.use>1990-01-01</start.use>
      <linkCOUid>COU0450</linkCOUid>
      <use.context>TED_SCHEMA</use.context>
   </record>

在我的示例中,“ lg.version”出现了很多次,我希望它只会出现1次。 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

总是说出您正在使用哪个版本的XSLT。

在XSLT 2.0中,它只是distinct-values(//*/node-name())(假设“节点”实际上是“元素”)。

如果您使用的是1.0版本,并且由于某些原因而无法前进,请使用Muenchian分组-这样会使情况变得更加复杂。