Перезапись гиперссылки XSL без воссоздания элемента - PullRequest
0 голосов
/ 25 августа 2010

Я разработал шаблон XSL, который переписывает все гиперссылки на странице HTML, содержащие определенную подстроку в атрибуте href.Это выглядит так:

<xsl:template match="A[contains(@href, 'asp')]">
    <a>
       <xsl:attribute name="href">
          <xsl:value-of select="bridge:linkFrom($bridge, $base, @href, 'intranet')" />
       </xsl:attribute>
       <xsl:apply-templates select="node()" />
    </a>
</xsl:template>

Мне не нравится тот факт, что я должен воссоздать элемент A с нуля.Я знаю, что вы можете сделать что-то вроде этого:

<xsl:template match="A/@href">
   <xsl:attribute name="href">
      <xsl:value-of select="bridge:linkFrom($bridge, $base, ., 'intranet')" />
   </xsl:attribute>
</xsl:template>

Но как мне объединить эти два вместе?Я пытался это, и это не работает (элемент не выбирается):

<xsl:template match="A[contains(@href, 'asp')]/@href">
    <xsl:attribute name="href">
       <xsl:value-of select="bridge:linkFrom($bridge, $base, ., 'intranet')" />
    </xsl:attribute>
</xsl:template>

Любая помощь очень ценится!

Ответы [ 2 ]

2 голосов
/ 25 августа 2010

Во-первых: если вы объявляете правило для сопоставления атрибута, тогда вы должны позаботиться о применять шаблоны к этим атрибутам , потому что нет встроенного правила, делающего это, и применять шаблоны без выбора такой же как apply-templates select="node()".

Итак, эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="a/@href[.='#']">
        <xsl:attribute name="href">http://example.org</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<root>
    <a href="#">link</a>
</root>

Выход:

<root>
    <a href="http://example.org">link</a>
</root>

Но эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="a/@href[.='#']">
        <xsl:attribute name="href">http://example.org</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Выход:

<root>
    <a>link</a>
</root>
0 голосов
/ 25 августа 2010

Я бы также ожидал, что это сработает. У меня нет возможности проверить это сейчас, но вы пробовали другой способ написать это? Например:

<xsl:template match="A/@href[contains(. , 'asp')]">
...