XSLT转换不保留属性

时间:2017-12-13 15:45:59

标签: xml xslt xslt-2.0

我们需要在src属性参数中找到并替换路径

<?xml version="1.0"?>
<ul>
<font> test sample font test </font>
<img src="/assets/rep/myimage.png"> test</img>
<img src="/assets/rep/myimage.png" height="20px"> test</img>
</ul>

我的XSLT如下

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- remove disallowed elements but keep its children -->
    <xsl:template match="font">
        <xsl:apply-templates></xsl:apply-templates>
    </xsl:template>

    <xsl:template match="@src">
        <xsl:variable name="imagesrc" select="replace(.,'/assets/rep/','/images/')"/>    
        <img src="{$imagesrc}" />
    </xsl:template> 
</xsl:stylesheet>

XSLT格式适用于

<img src="/assets/rep/myimage.png"> test</img>

但不适用于

<img src="/assets/rep/myimage.png" height="20px"> test</img>

我尝试添加match =&#34; @src [parent :: img]&#34;但这也不起作用。你能让我知道我在XSLT中缺少什么来保留属性并且只修改&#34; src&#34;属性?

2 个答案:

答案 0 :(得分:2)

将您当前的逻辑更改为以下模板:

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

<xsl:template match="img/@src">
    <xsl:attribute name="src">
        <xsl:value-of select="replace(.,'/assets/rep/','/images/')"/>
    </xsl:attribute>
</xsl:template>
...

在您的尝试中,您创建了一个元素<img>,而您的context-node是一个属性@src。通过提供的示例,您将没事!

答案 1 :(得分:1)

试试这个:

<xsl:template match="@src">
    <xsl:attribute name="src">
        <xsl:value-of select="replace(.,'/assets/rep/','/images/')"/>
    </xsl:attribute>
</xsl:template>