如何防止循环中的xsl转换?

时间:2016-06-09 00:25:58

标签: xml xslt

我正在处理一个基本上是字典的文件。我想要做的是只选择具有特定“域”的文章,并以不同的方式重新组织它们。 我的问题是,一切似乎都很好,除了我一遍又一遍地收到数百篇关于同一篇文章的文章,我不知道为什么! 你能帮我解开这个谜吗?

这是我的XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes" encoding="UTF-8"/>
  <xsl:strip-space elements="*"/>

<xsl:template match="/">
    <html>
        <body>
    <xsl:apply-templates/>
        </body>
    </html>
</xsl:template>

  <xsl:template match="article">
          <xsl:for-each select="//label">
              <xsl:if test="./@type ='domain'">
            <xsl:element name="article">
                <xsl:element name="domaine">
                    <xsl:value-of select="./@value"/>
                </xsl:element>
                <xsl:element name="div">
                    <xsl:element name="h2">
                    <xsl:value-of select="ancestor::article/title"/>
                    </xsl:element>
                    <xsl:for-each select="ancestor::pos/descendant::pron">
                    <xsl:element name="p">
                        <xsl:value-of select="."/>
                    </xsl:element>
                    </xsl:for-each>
                    <xsl:for-each select="ancestor::pos//inflection">
                        <xsl:element name="p">
                            <xsl:text>Flexion : </xsl:text>
                            <xsl:value-of select="@form"/>
                            <xsl:text>; Prononciation : </xsl:text>
                            <xsl:value-of select="@prons"/>
                        </xsl:element>
                    </xsl:for-each>
                </xsl:element>
              <xsl:element name="div">
                  <xsl:element name="p">
                  <xsl:text>Définition : </xsl:text>
          <xsl:value-of select="ancestor::definition/gloss/txt"/>
                      <xsl:for-each select="ancestor::pos//example/txt">
                      <xsl:text>
                          Exemple : </xsl:text>
                          <xsl:value-of select="."/>
                      </xsl:for-each>
                  </xsl:element>
              </xsl:element>
            </xsl:element>
              </xsl:if>
        </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

这是我的输入基本上看起来像(它只是一系列不同的文章):

<?xml-stylesheet type="text/xsl" href="sajous.xslt"?>
<split>
  <article>
    <title>aiguchi</title>
    <pageId>471440</pageId>
    <meta>
      <category>u prononcés /u/ en français</category>
      <category>ch prononcés /tʃ/ en français</category>
    </meta>
    <text>
      <etymology>
        <etym>
          <xml>du japonais <foreignWord lang="ja" translit="aïguchi">合口</foreignWord>.</xml>
          <txt>du japonais 合口 aïguchi.</txt>
        </etym>
      </etymology>
      <pos type="nom" lemma="1" locution="0" gender="m" number="s">
        <pronunciations>
          <pron>aj.gu.tʃi</pron>
        </pronunciations>
        <paradigm>
          <inflection form="aiguchi" gracePOS="Ncms" prons="aj.gu.tʃi"/>
        </paradigm>
        <definitions>
          <definition>
            <gloss>
              <xml>Monture pour une lame de <innerLink ref="tanto">tanto</innerLink> plus épurée que la monture standard buke-zukuri, où le couteau n'a pas de garde et où le <innerLink ref="sageo">sageo</innerLink> est inexistant dans la majorité des cas.</xml>
              <txt>Monture pour une lame de tanto plus épurée que la monture standard buke-zukuri, où le couteau n'a pas de garde et où le sageo est inexistant dans la majorité des cas.</txt>
            </gloss>
          </definition>
          <definition>
            <gloss>
              <labels>
                <label type="sem" value="métonymie"/>
                <label type="domain" value="armes blanches"/>
              </labels>
              <xml><innerLink ref="tanto#fr">Tanto</innerLink> monté en aïguchi.</xml>
              <txt>Tanto monté en aïguchi.</txt>
            </gloss>
          </definition>
        </definitions>
        <subsection type="alternativeForm">
          <item>aikuchi</item>
        </subsection>
      </pos>
    </text>
  </article>
</split>

1 个答案:

答案 0 :(得分:1)

当你匹配文章时:

<xsl:for-each select="//label">

然后循环遍历整个文档的标签,即所有文章的标签:

<xsl:for-each select=".//label">

但您只想要匹配文章的标签。因此写

false