如何在 xslt 1.0 中重置位置(位置())



我有一个XML文件,我在其中重复,它们有自己的ITEM_ID和NAME。正如您在示例中所看到的,我们有 6 个项目:

<ITEMS>
    <ITEM>
        <ITEM_ID>1234</ITEM_ID>
        <ITEM_NAME>TEST_ITEM_1</ITEM_NAME>
    </ITEM>
    <ITEM>
        <ITEM_ID>3216</ITEM_ID>
        <ITEM_NAME>TEST_ITEM_2</ITEM_NAME>
    </ITEM>
    <ITEM>
        <ITEM_ID>8956</ITEM_ID>
        <ITEM_NAME>TEST_ITEM_3</ITEM_NAME>
    </ITEM>
    <ITEM>
        <ITEM_ID>4562</ITEM_ID>
        <ITEM_NAME>TEST_ITEM_4</ITEM_NAME>
    </ITEM>
    <ITEM>
        <ITEM_ID>4562</ITEM_ID>
        <ITEM_NAME>TEST_ITEM_5</ITEM_NAME>
    </ITEM>
    <ITEM>
        <ITEM_ID>8569</ITEM_ID>
        <ITEM_NAME>TEST_ITEM_6</ITEM_NAME>
    </ITEM>
</ITEMS>

我希望结果是这样的:

<ARTICLES>
    <ARTICLE CODE="1">
        <ARTICLE_ID>1234</ARTICLE_ID>
        <ARTICLE_NAME>TEST_ARTICLE_1</ARTICLE_NAME>
    </ARTICLE>
    <ARTICLE CODE="2">
        <ARTICLE_ID>3216</ARTICLE_ID>
        <ARTICLE_NAME>TEST_ARTICLE_2</ARTICLE_NAME>
    </ARTICLE>
    <ARTICLE CODE="3">
        <ARTICLE_ID>8956</ARTICLE_ID>
        <ARTICLE_NAME>TEST_ARTICLE_3</ARTICLE_NAME>
    </ARTICLE>
    <ARTICLE CODE="4">
        <ARTICLE_ID>4562</ARTICLE_ID>
        <ARTICLE_NAME>TEST_ARTICLE_4</ARTICLE_NAME>
    </ARTICLE>
    <ARTICLE CODE="4">
        <ARTICLE_ID>4562</ARTICLE_ID>
        <ARTICLE_NAME>TEST_ARTICLE_5</ARTICLE_NAME>
    </ARTICLE>
    <ARTICLE CODE="5">
        <ARTICLE_ID>8569</ARTICLE_ID>
        <ARTICLE_NAME>TEST_ARTICLE_6</ARTICLE_NAME>
    </ARTICLE>
</ARTICLES>

在这里,属性 CODE 应该具有 ITEM 的位置,但其中ITEM_ID相同,例如第 4 和第 5 个,那么在这种情况下,在结果文件中,CODE 应该具有与您在结果文件中看到的值相同的值(CODE 属性)。下一个节点不应具有输入 xml 的实际位置,而应将增量编号设置为"5",因为您可以在结果 XML 中看到最后一个 ARTICLE。

提前谢谢。

你会得到编号

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="by-id" match="ITEM" use="ITEM_ID"/>
<xsl:template match="ITEMS">
  <ARTICLES>
    <xsl:apply-templates select="ITEM[generate-id() = generate-id(key('by-id', ITEM_ID)[1])]"/>
  </ARTICLES>
</xsl:template>
<xsl:template match="ITEM">
  <xsl:variable name="pos" select="position()"/>
  <xsl:apply-templates select="key('by-id', ITEM_ID)" mode="article">
    <xsl:with-param name="code" select="$pos"/>
  </xsl:apply-templates>
</xsl:template>
<xsl:template match="ITEM" mode="article">
  <xsl:param name="code"/>
  <ARTICLE CODE="{$code}">
    <xsl:apply-templates/>
  </ARTICLE>
</xsl:template>
<xsl:template match="ITEM_ID">
  <ARTICLE_ID>
    <xsl:apply-templates/>
  </ARTICLE_ID>
</xsl:template>
<xsl:template match="ITEM_NAME">
  <ARTICLE_NAME>
    <xsl:apply-templates/>
  </ARTICLE_NAME>
</xsl:template>
</xsl:stylesheet>

您似乎还想将每个名称中的"ITEM"一词替换为"ARTICLE",这可以通过模板中调用的模板来完成 ITEM_NAME .下面是一个示例:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="by-id" match="ITEM" use="ITEM_ID"/>
<xsl:template match="ITEMS">
  <ARTICLES>
    <xsl:apply-templates select="ITEM[generate-id() = generate-id(key('by-id', ITEM_ID)[1])]"/>
  </ARTICLES>
</xsl:template>
<xsl:template match="ITEM">
  <xsl:variable name="pos" select="position()"/>
  <xsl:apply-templates select="key('by-id', ITEM_ID)" mode="article">
    <xsl:with-param name="code" select="$pos"/>
  </xsl:apply-templates>
</xsl:template>
<xsl:template match="ITEM" mode="article">
  <xsl:param name="code"/>
  <ARTICLE CODE="{$code}">
    <xsl:apply-templates/>
  </ARTICLE>
</xsl:template>
<xsl:template match="ITEM_ID">
  <ARTICLE_ID>
    <xsl:apply-templates/>
  </ARTICLE_ID>
</xsl:template>
<xsl:template match="ITEM_NAME">
  <ARTICLE_NAME>
    <xsl:call-template name="replace">
      <xsl:with-param name="input" select="."/>
      <xsl:with-param name="to-be-replaced" select="'ITEM'"/>
      <xsl:with-param name="replacement" select="'ARTICLE'"/>
    </xsl:call-template>
  </ARTICLE_NAME>
</xsl:template>
<xsl:template name="replace">
  <xsl:param name="input"/>
  <xsl:param name="to-be-replaced"/>
  <xsl:param name="replacement"/>
  <xsl:choose>
    <xsl:when test="not(contains($input, $to-be-replaced))">
      <xsl:value-of select="$input"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="substring-before($input, $to-be-replaced)"/>
      <xsl:copy-of select="$replacement"/>
      <xsl:call-template name="replace">
        <xsl:with-param name="input" select="substring-after($input, $to-be-replaced)"/>
        <xsl:with-param name="to-be-replaced" select="$to-be-replaced"/>
        <xsl:with-param name="replacement" select="$replacement"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新