C# 如何更改同级属性的值
我有一个从外部应用程序生成的XML文档,但该应用程序无法访问某些文件信息,即文件校验和。元素包含在输出中,但值为空。我需要通过XSL修改XML以包含校验和,但是我很难创建XSL来实现这一点 在下面的示例中,有3个ADI/Asset/Asset元素,每个元素表示一个单独的文件(电影、预览和海报)。校验和通过每个文件的XSLTargetList传递(使用XslCompiledTransform进行转换)。我可以创建一个与正确的资产元素匹配的模板,但随后需要修改它的同级元素 只有一个资产包含一个元素,或者任何其他值对应一个值C# 如何更改同级属性的值,c#,xml,xslt,C#,Xml,Xslt,我有一个从外部应用程序生成的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。@布莱恩:我已经改进了我的答案。它现在更短,更少多余了。工作得很好。仅将
更改为
,因为每个生成的文件的文件名都不同。谢谢我已经改变了这个细节,并且稍微缩减了第二个模板。