XSLT 1.0中的属性值查找和替换

时间:2018-10-25 20:35:04

标签: xslt

我在获取属性值(即URL)并将“ .webvtt”替换为“ .vtt”时遇到麻烦。我找到了与调用函数的语句一起使用的示例,但是我试图调用从另一个SO线程(thanks Dimitre Novatchev)获取的模板。 XSLT应该复制所有内容,然后匹配元素media:content中的属性“ url”,并用vtt查找和替换值中的webvtt。当前,它写入一个空的url属性。

XML:

<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:os="http://a9.com/-/spec/opensearch/1.1/"
     version="2.0">
   <channel>
      <title>Distribution Feed</title>
      <link>http://feed.somelocation.com</link>
      <description>Distribution</description>
      <os:startIndex>1</os:startIndex>
      <os:itemsPerPage>100</os:itemsPerPage>
      <item>
         <title>
            Yadda Yadda
        </title>
         <description>Blah blah</description>
         <author/>
         <media:group>
            <media:content channels="2"
                           samplingrate="44.1"
                           bitrate="2631.083"
                           medium="video"
                           duration="128.195"
                           expression="full"
                           fileSize="42161461"
                           framerate="29.97"
                           type="video/mp4"
                           height="720"
                           isDefault="false"
                           lang="en"
                           url="http://myorigin.here/example.webvtt?parameters=here" />  
         </media:group>
         <pubDate>Tue, 16 Oct 2018 14:41:41 GMT</pubDate>
      </item>
    </channel>
</rss>

还有我的XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:media="http://search.yahoo.com/mrss/" >

    <xsl:output method="xml" indent="yes"/>

    <xsl:template name="string-replace-all">
    <xsl:param name="text" />
    <xsl:param name="replace" />
    <xsl:param name="by" />
    <xsl:choose>
        <xsl:when test="$text = '' or $replace = ''or not($replace)" >
            <!-- Prevent this routine from hanging -->
            <xsl:value-of select="$text" />
        </xsl:when>
        <xsl:when test="contains($text, $replace)">
            <xsl:value-of select="substring-before($text,$replace)" />
            <xsl:value-of select="$by" />
            <xsl:call-template name="string-replace-all">
                <xsl:with-param name="text" select="substring-after($text,$replace)" />
                <xsl:with-param name="replace" select="$replace" />
                <xsl:with-param name="by" select="$by" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

    <!-- Just copy everything to the output... -->
    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="media:content/@url">
        <xsl:attribute name="url">
            <xsl:call-template name="string-replace-all">
                <xsl:with-param name="text" select="./@url" />
                <xsl:with-param name="replace" select="'webvtt'" />
                <xsl:with-param name="by" select="'vtt'" />
            </xsl:call-template>
        </xsl:attribute>
    </xsl:template>


</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

调用模板时,您已经在@url的上下文中-请替换:

<xsl:with-param name="text" select="./@url" />

具有:

<xsl:with-param name="text" select="." />