2015-03-09 2 views
1

После некоторого поиска в Интернете я не могу найти ответ на этот вопрос. Мои знания и опыт новичка ..Замена некоторого значения атрибута на 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> 

Я хочу XML-файл после обработки в XSLT, чтобы выглядеть примерно так:

<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. . Все посты в справке

ответ

1

Вот что вы могли бы сделать, если неизвестное количество / в значении атрибута, которое вам нужно избавиться. Определение именованного шаблона - хорошая идея, если ваша таблица стилей должна работать как с 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 Output

<?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> 
+0

Есть ли какой-либо причине вы написали 'версия =«2.0»' таблицы стилей, а затем используется '' как функция только XSLT 2.0? Ваше введение гласит: «Определение именованного шаблона - хорошая идея, если ваша таблица стилей должна работать как с XSLT 1.0, так и с XSLT 2.0», но в этом случае я ожидаю, что опубликованный код покажет решение, которое работает в XSLT 1.0. Или, если вы действительно хотели использовать XSLT 2.0, вы могли бы просто использовать ''. –

+0

@MartinHonnen Это действительно ошибка, спасибо - я исправлю это, как только у меня будет время. –

+0

@MartinHonnen Спасибо за ваш комментарий, теперь нужно исправлять. –

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

+1

OP хотел получить решение XSLT, а не решение Perl. Ваш ответ не имеет значения. – PhillyNJ

+0

@PhilVallone, я думаю, вы правы. – JJoao

Смежные вопросы