Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改同级属性的值_C#_Xml_Xslt - Fatal编程技术网

C# 如何更改同级属性的值

C# 如何更改同级属性的值,c#,xml,xslt,C#,Xml,Xslt,我有一个从外部应用程序生成的XML文档,但该应用程序无法访问某些文件信息,即文件校验和。元素包含在输出中,但值为空。我需要通过XSL修改XML以包含校验和,但是我很难创建XSL来实现这一点 在下面的示例中,有3个ADI/Asset/Asset元素,每个元素表示一个单独的文件(电影、预览和海报)。校验和通过每个文件的XSLTargetList传递(使用XslCompiledTransform进行转换)。我可以创建一个与正确的资产元素匹配的模板,但随后需要修改它的同级元素 只有一个资产包含一个元素,

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

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

只有一个资产包含一个元素,或者任何其他值对应一个值

<?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>

谢谢你的帮助


Brian

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

<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>


这是否意味着每个文件都有x
元数据
元素?那么样式表有多少个参数?每个ADI/资产将有任意数量的资产,但每个ADI/资产/资产只有1个元数据。实际上,只有3个(电影、预览、海报)。目前,只有两个参数,movie\u checksum和preview\u checksum。@布莱恩:我已经改进了我的答案。它现在更短,更少多余了。工作得很好。仅将
更改为
,因为每个生成的文件的文件名都不同。谢谢我已经改变了这个细节,并且稍微缩减了第二个模板。