我有一个从外部应用程序生成的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>
感谢您的帮助。
布赖恩
答案 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>