使用XSL修改标记内容

时间:2015-05-22 13:53:45

标签: xslt

我有以下XML:

    <dependency>
        <groupId>blabla1</groupId>
        <artifactId>test1</artifactId>
        <version>if strArtifactId equals test1, put iVersion value here</version>
    </dependency>

    <dependency>
        <groupId>blabla2</groupId>
        <artifactId>test2</artifactId>
        <version>if strArtifactId equals test2, put iVersion value here</version>
    </dependency>

    <dependency>
        <groupId>blabla3</groupId>
        <artifactId>test3</artifactId>
        <version>if strArtifactId equals test3, put iVersion value here</version>
    </dependency>

以下XSL:

   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:param name="strArtifactID"/>
  <xsl:param name="iVersion"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="artifactId">

    <xsl:copy>
      <xsl:value-of select="$strArtifactID"/>
    </xsl:copy>

  </xsl:template>

  <xsl:template match="version">
    <xsl:copy>
      <xsl:value-of select="$iVersion"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

我需要做的是用我的参数

替换依赖项的version标签

strArtifactId:选择要修改的依赖版本。

iVersion:我想要的版本。

这两个参数都由GUI给出。

问题:当我启动代码时,它只会复制原始的xml,但没有任何变化。

请帮忙吗?

1 个答案:

答案 0 :(得分:0)

您提供的XML不完整,因此我在代码示例中的<root>个节点周围添加了<dependency>节点,以使其成为有效的XML。

所以你的XML看起来像这样:

<root>
  <dependency>
    <groupId>blabla1</groupId>
    <artifactId>test1</artifactId>
    <version>if strArtifactId equals test1, put iVersion value here</version>
  </dependency>
  <dependency>
    <groupId>blabla2</groupId>
    <artifactId>test2</artifactId>
    <version>if strArtifactId equals test2, put iVersion value here</version>
  </dependency>
  <dependency>
    <groupId>blabla3</groupId>
    <artifactId>test3</artifactId>
    <version>if strArtifactId equals test3, put iVersion value here</version>
  </dependency>
</root>

以下是XSL样式表,它将根据符合上述示例的XML为您提供所需的结果:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:param name="strArtifactID" />
  <xsl:param name="iVersion" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="dependency">
    <dependency>
      <xsl:copy-of select="groupId" />
      <xsl:copy-of select="artifactId" />
      <xsl:choose>
        <xsl:when test="artifactId = $strArtifactID">
          <version><xsl:value-of select="format-number($iVersion, '#.0')" /></version>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select="version" />
        </xsl:otherwise>
      </xsl:choose>
    </dependency>
  </xsl:template>

</xsl:stylesheet>

所以样式表中发生的事情是:

  1. 您的'strArtifactID'和'iVersion'参数值是由您提到的GUI设置的(我使用select =“'test1'”为其分配值,并在名称值后选择=“1.0”,仅用于测试目的)
  2. 标识模板可以生成XML的精确副本。
  3. <dependency>节点以您想要的格式重建(步骤4,5,6)。
  4. 只复制<groupId><artifactId>个节点,因为它们的内容不会更改。
  5. <artifactId>中的<dependency>节点值与'strArtifactID'参数值的值匹配时,会创建一个包含'iVersion'参数值的<version>节点(我有假设是数字,并且格式化为保留一个小数位。)
  6. <artifactId>中的<dependency>节点值与'strArtifactID'参数值的值不匹配时,将复制现有的<version>节点。