如何更改兄弟属性的值

时间:2009-11-05 18:07:13

标签: c# xml xslt

我有一个从外部应用程序生成的XML文档,但该应用程序无法访问某些文件信息,即文件校验和。元素包含在ouptut中,但值为空。我需要通过XSL修改XML以包含校验和,但是我很难创建一个XSL来执行此操作。

在下面的示例中,有3个ADI / Asset / Asset元素,每个元素代表一个单独的文件(电影,预览和海报)。校验和通过XsltArgumentList传入每个文件(使用XslCompiledTransform进行转换)。我可以创建一个与正确的Asset元素匹配的模板,但是然后需要修改它的兄弟元素。

只有1个资产带有元素,或者任何其他值。

<?xml version="1.0" encoding="utf-8"?>
<ADI>
  <Asset>
    <MetaData>
      <App_Data App="SVOD" Name="Title" Value="The Shawshank Redemption" />
    </MetaData>
    <Asset>
      <MetaData>
        <App_Data App="SVOD" Name="Type" Value="movie" />
        <App_Data App="SVOD" Name="Content_FileSize" Value="" />
        <App_Data App="SVOD" Name="Content_Checksum" Value="9645154523" />
      </MetaData>
      <Content Value="movie.wmv" />
    </Asset>
    <Asset>
      <MetaData>
        <App_Data App="SVOD" Name="Type" Value="preview" />
        <App_Data App="SVOD" Name="Content_FileSize" Value="" />
        <App_Data App="SVOD" Name="Content_Checksum" Value="5481523" />
      </MetaData>
      <Content Value="preview.wmv" />
    </Asset>
    <Asset>
      <MetaData>
        <App_Data App="SVOD" Name="Type" Value="poster" />
        <App_Data App="SVOD" Name="Content_CheckSum" Value="edb10756c98a83b72d913fb49fef64d7" />
        <App_Data App="SVOD" Name="Content_FileSize" Value="230456" />
      </MetaData>
      <Content Value="poster.bmp" />
    </Asset>
  </Asset>
</ADI>

需要到达:

<?xml version="1.0" encoding="utf-8"?>
<ADI>
  <Asset>
    <MetaData>
      <App_Data App="SVOD" Name="Title" Value="The Shawshank Redemption" />
    </MetaData>
    <Asset>
      <MetaData>
        <App_Data App="SVOD" Name="Type" Value="movie" />
        <App_Data App="SVOD" Name="Content_FileSize" Value="My checksum value here" />
        <App_Data App="SVOD" Name="Content_Checksum" Value="9645154523" />
      </MetaData>
      <Content Value="movie.wmv" />
    </Asset>
    <Asset>
      <MetaData>
        <App_Data App="SVOD" Name="Type" Value="preview" />
        <App_Data App="SVOD" Name="Content_FileSize" Value="" />
        <App_Data App="SVOD" Name="Content_Checksum" Value="5481523" />
      </MetaData>
      <Content Value="preview.wmv" />
    </Asset>
    <Asset>
      <MetaData>
        <App_Data App="SVOD" Name="Type" Value="poster" />
        <App_Data App="SVOD" Name="Content_CheckSum" Value="edb10756c98a83b72d913fb49fef64d7" />
        <App_Data App="SVOD" Name="Content_FileSize" Value="230456" />
      </MetaData>
      <Content Value="poster.bmp" />
    </Asset>
  </Asset>
</ADI>

感谢您的帮助。

布赖恩

1 个答案:

答案 0 :(得分:3)

这可以通过修改后的身份转换来完成:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:param name="movie_checksum" select="''" />
  <xsl:param name="preview_checksum" select="''" />

  <!-- the identity template copies everything verbatim -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>

  <!-- this template specifically handles checksum values -->
  <xsl:template match="App_Data[@Name = 'Content_Checksum']/@Value">
    <xsl:copy>
      <xsl:variable name="type" select="../App_Data[@Name='Type']/@Value" />
      <xsl:choose>
        <xsl:when test="$type = 'movie'">
          <xsl:value-of select="$movie_checksum" />
        </xsl:when>
        <xsl:when test="$type = 'preview'">
          <xsl:value-of select="$preview_checksum" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="." />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>