1

我是 XSLT 的新手,我花了好几个小时试图找出一个看似微不足道的问题的解决方案。

我有一个 xml 文档,其中包含这样的列表:

  <Header>
    <URLList>
      <URLItem type="type1">
        <URL></URL>
      </URLItem>
      <URLItem type="type2">
        <URL>2</URL>
      </URLItem>
    </URLList>
  </Header>

如果它不存在,我现在需要为每个 URLItem 添加一个“ID”元素。ID 元素的值必须是递增的值。

xml 最终应如下所示:

  <Header>
    <URLList>
      <URLItem type="type1">
        <ID>1</ID>
        <URL></URL>
      </URLItem>
      <URLItem type="type2">
        <ID>2</ID>
        <URL>2</URL>
      </URLItem>
    </URLList>
  </Header>

我一直在尝试各种事情,但无法使其正常工作。

例如,如果我尝试使用模板来匹配列表,我无法获得正确的增量值。ID 值是 [2,4],但不是应该的 [1,2]... 这是 xslt:

  <xsl:template match="/Header/URLList/URLItem[not(child::ID)]">
    <xsl:copy>
      <ID> <xsl:value-of select="position()"/></ID>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

我也一直在尝试使用这样的 for-each 循环:

  <xsl:template match="/Header/URLList">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
    <xsl:for-each select="/Header/URLList/URLItem">
        <xsl:if test="not(ID)">
          <xsl:element name="ID"><xsl:value-of select="position()" /></xsl:element>
        </xsl:if>
    </xsl:for-each>
  </xsl:template>

这样我似乎得到了正确的增量,但新的 ID 元素出现在父节点上。我一直无法找到将它们附加为 URLItem 元素的子元素的方法。

非常感谢任何帮助。

4

2 回答 2

3

代替

  <xsl:template match="/Header/URLList/URLItem[not(child::ID)]">
    <xsl:copy>
      <ID> <xsl:value-of select="position()"/></ID>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

采用

  <xsl:template match="/Header/URLList/URLItem[not(child::ID)]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <ID><xsl:number/></ID>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
于 2012-10-29T16:02:51.780 回答
0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="/">
<Header>
<xsl:apply-templates select="//URLList"/>
</Header>
</xsl:template>
<xsl:template match="URLList">
<URLList>
<xsl:for-each select="URLItem[not(child::ID)]">
<xsl:copy>
    <xsl:apply-templates select="@*"/>
      <ID> <xsl:value-of select="position()"/></ID>
      <xsl:copy-of select="URL"/>
    </xsl:copy>
  </xsl:for-each>
  </URLList>
  </xsl:template>
  <xsl:template match="@*">
<xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>
于 2012-10-29T16:38:54.590 回答