2016-07-22 2 views
1

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

К сожалению, эти подстановочные знаки также используются в качестве значений атрибутов в этом XML-файле.

Я дам вам пример:

<control> 
    <some-tag id="$wildcard1$" version="3.14"> 
    <another-tag id="second_level">stackoverflow rocks!</another-tag> 
    </some-tag> 
    <some-tag id="foo" version="$wildcard2$"/> 
    <some-tag id="bar" version="145.31.1"/> 
</control> 

Я попытался написать общее преобразование с параметрами, чтобы заменить символы в значениях атрибутов.

Моя самая большая проблема была в том, что я не знаю названия атрибута. Поэтому мне нужно сопоставить каждый атрибут в файле XML. Это легко , но как я сопоставляю каждый атрибут с определенным значением (например, $ wildcard $)?

ответ

1

Ответ на этот вопрос был намного проще, чем я думал.

<xsl:template match="@*[. = $wildcard]"> 
    <xsl:attribute name="{name(.)}"> 
     <xsl:value-of select="$wildcard_value"/> 
    </xsl:attribute> 
</xsl:template> 

Я надеюсь, что это поможет кому-то.

PS: Вот мой полный XSL-преобразование, чтобы заменить символы в значения атрибутов:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:param name="wildcard" required="yes" /> 
    <xsl:param name="wildcard_value" required="yes" /> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" 
     indent="yes" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@*[. = $wildcard]"> 
     <xsl:attribute name="{name(.)}"> 
      <xsl:value-of select="$wildcard_value" /> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 
+2

Заметим, что 'матч = "[. = $ Wildacard] */@ *"' может быть сокращен до 'матча = "@ * [. = $ wildacard]". И если вы действительно используете XSLT версии 3.0, то вместо первого шаблона вы можете просто объявить ''. Я также заметил, что ваше объявленное имя параметра - 'имя =" подстановочный знак ", но ваш код ссылается на' $ wildacard'. –

+0

работает только с корпоративной версией саксона. Поэтому я решил пометить таблицу стилей как версию 2.0 – commandcraxx