在互联网上进行一些搜索后,我无法找到答案。我的知识和经验是新手..
我的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属性。 感谢所有帮助
答案 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
的作者之一