Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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
基于其他属性值替换xml属性_Xml_Xslt - Fatal编程技术网

基于其他属性值替换xml属性

基于其他属性值替换xml属性,xml,xslt,Xml,Xslt,我是XSLT新手,因此非常感谢您的帮助。 我在stackoverflow上搜索了很多,尝试了几种方法,但都失败了 我有这样一个xml: <?xml version="1.0" encoding="utf-8"?> <asset_detail> <asset id="1" show_type="Movies"> <title><![CDATA[Movie]]></t

我是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>)
如果媒体列表/media/version/@format='**HLS**'我需要将**@rel\u路径**替换为
值:**concat**(**@rel_path***,****的现有值)**
(我作为一名工程师传递给xsl)
我想我必须使用类似于:

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


我知道它不起作用:)

你很接近了。传递给样式表的全局参数应该在外部级别声明(移动到
输出
元素的同级之后)。HLS格式匹配也可以直接在模板
[@format='HLS']
中完成。此外,在
值上缺少一个结束元素标记。最后,您不能直接更改匹配元素的属性;因此,下面的
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>


希望这有帮助。

一个简短的解决方案,使用(属性值模板):

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

在提供的XML文档上应用此转换时:

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

生成所需的正确结果:

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

电影