我是XSLT的新手,所以我真的很感激任何帮助。 我在stackoverflow上搜索了很多,尝试应用了几种方法,但都失败了。
我有一个像这样的xml:
<?xml version="1.0" encoding="utf-8"?>
<asset_detail>
<asset id="1" show_type="Movies">
<title><![CDATA[Movie]]></title>
<media_list>
<media id="11" title="" type="trailer">
<version format="m3u8" rel_path="/Content/movie.m3u8"/>
<version format="HLS" rel_path="/movies/movie.m3u8"/>
</media>
</media_list>
</asset>
</asset_detail>
我应该复制整个xml和:
if media_list/media/version/@format = '**HLS**' I need to replace **@rel_path** with
value: **concat**(existing value of **@rel_path****,** **someVariable**
(I'm passing to xsl as a <xsl:param>)
我想我必须使用类似的东西:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:param name="someVariable"/>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="media/version">
<xsl:attribute name="rel_path">
<xsl:choose>
<xsl:when test="./@format = HLS">
<xsl:value-of select="concat(rel_path,$someVariable)">
</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
我知道它不起作用:)。
答案 0 :(得分:7)
更短的解决方案,使用AVT(属性值模板):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="psomeParam" select="'/xxx'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="version[@format='HLS']">
<version rel_path="{@rel_path}{$psomeParam}">
<xsl:apply-templates select="@*[not(name()='rel_path')] | node()"/>
</version>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<asset_detail>
<asset id="1" show_type="Movies">
<title><![CDATA[Movie]]></title>
<media_list>
<media id="11" title="" type="trailer">
<version format="m3u8" rel_path="/Content/movie.m3u8"/>
<version format="HLS" rel_path="/movies/movie.m3u8"/>
</media>
</media_list>
</asset>
</asset_detail>
产生了想要的正确结果:
<asset_detail>
<asset id="1" show_type="Movies">
<title>Movie</title>
<media_list>
<media id="11" title="" type="trailer">
<version format="m3u8" rel_path="/Content/movie.m3u8"/>
<version rel_path="/movies/movie.m3u8/xxx" format="HLS"/>
</media>
</media_list>
</asset>
</asset_detail>
答案 1 :(得分:1)
你非常接近。传递给样式表的全局参数应该在外层声明(移动到output
元素的跟随兄弟)。 HLS格式匹配也可以直接在模板[@format='HLS']
中完成。您还错过了value-of
上的结束元素标记。最后,您无法直接更改匹配元素的属性;因此下面是copy
元素,使用现有属性+更新格式发布匹配元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="someVariable"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="media/version[@format='HLS']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="rel_path">
<xsl:value-of select="concat(@format,$someVariable)"/>
</xsl:attribute>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
希望这有帮助。