用XSLT替换一些属性值

时间:2015-03-09 15:33:34

标签: xml xslt

在互联网上进行一些搜索后,我无法找到答案。我的知识和经验是新手..

我的xml文件:

<figuregroup id="1408-46-00-4506">
                 <figure id="1408-46-00-4507"
                         href="http://A_Internet_Location/Images/img3.tif"
                         height="5.098in"
                         width="2.798in"
                         align="acenter"
                         placement="break"
                         orient="port"/>
                 <title id="Pt2Ch3-1408-46-00-4508">fig title</title>
</figuregroup> 

我希望xslt处理后的xml文件看起来像这样:

<figuregroup id="1408-46-00-4506">
                     <figure id="1408-46-00-4507"
                             href="img3.tif"
                             height="5.098in"
                             width="2.798in"
                             align="acenter"
                             placement="break"
                             orient="port"/>
                     <title id="Pt2Ch3-1408-46-00-4508">fig title</title>
</figuregroup> 

只有更改是href属性减少为img3.tif

我尝试过这样的票价:

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

   <xsl:template match="figure[contains(@href, 'http://A_Internet_Location/Images/')]">


    <xsl:copy>
        <xsl:choose>
            <xsl:when test="contains(@href, 'http://A_Internet_Location/Images/')">
        <xsl:call-template name="remove">
             <xsl:with-param name="value" select="@href"/>
        </xsl:call-template> 
            </xsl:when>
        </xsl:choose>
        <xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template> 

    <xsl:template name="remove">
    <xsl:param name="value"/>
    <xsl:value-of select="concat(substring-before($value, 'http://A_Internet_Location/Images/'), substring-after($value, 'http://A_Internet_Location/Images/'))"/>
</xsl:template>

这样做是正确的,但不是减少href属性。 感谢所有帮助

2 个答案:

答案 0 :(得分:2)

如果属性值中存在未知数量的/,您可以执行以下操作。如果样式表适用于XSLT 1.0和XSLT 2.0,则定义命名模板是个好主意。

指定模板recursive-substring的参数为$string$anchor。它输出$string的子字符串 $anchor$string的最后一次出现后的

<强>样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

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

    <xsl:template match="figure/@href">
        <xsl:attribute name="href">
            <xsl:call-template name="recursive-substring">
                <xsl:with-param name="anchor" select="'/'"/>
                <xsl:with-param name="string" select="."/>
            </xsl:call-template>
        </xsl:attribute>
    </xsl:template>

    <xsl:template name="recursive-substring">
        <xsl:param name="anchor"/>
        <xsl:param name="string"/>

        <xsl:choose>
            <xsl:when test="contains($string,$anchor)">
                <xsl:call-template name="recursive-substring">
                    <xsl:with-param name="anchor" select="'/'"/>
                    <xsl:with-param name="string" select="substring-after($string,$anchor)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$string"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

XML输出

<?xml version="1.0" encoding="UTF-8"?>
<figuregroup id="1408-46-00-4506">
    <figure id="1408-46-00-4507" href="img3.tif" height="5.098in" width="2.798in" align="acenter" placement="break" orient="port"/>
    <title id="Pt2Ch3-1408-46-00-4508">fig title</title>
</figuregroup>

答案 1 :(得分:0)

好的,好吧,这不是xslt

#!/usr/bin/perl
use XML::DT;                       # attributes: %v; content: $c; tag: $q
use strict;

print dt($ARGV[0], figure => sub{ $v{href} =~ s!.*/!!; toxml } );

可能需要调整替换s!.*/!!

免责声明:我是XML :: DT

的作者之一