#xslt
#xslt
Вопрос:
Мой XML-файл выглядит следующим образом.
<rule>
<name>86</name>
<ruleId>100</ruleId>
<ruleVersion>1.0</ruleVersion>
<brlVersion>1.0</brlVersion>
</rule>
Мне нужно заменить name на brlName, и мне нужно добавить другой тег в качестве drlName.Результат должен выглядеть следующим образом.
<rule>
<brlName>86</brlName>
<ruleId>100</ruleId>
<ruleVersion>1.0</ruleVersion>
<brlVersion>1.0</brlVersion>
<drlName>86_1.0</drlName>
</rule>
Пожалуйста, помогите мне с соответствующим xsl, чтобы получить желаемый результат.
Ценю вашу помощь!
Комментарии:
1. Хороший вопрос, 1. Смотрите мой ответ для получения полного, короткого и простого решения, основанного на самом фундаментальном и мощном шаблоне проектирования XSLT — использовании и переопределении правила идентификации / шаблона.
2. Почему некоторые люди задают вопросы и, получив, позвольте мне сказать, хорошие ответы, не предоставляют никакой обратной связи? Иногда это очень раздражает.
3. Добро пожаловать в Stack Overflow, empo.
Ответ №1:
Это типичная задача для преобразования идентификатора (первое правило шаблона в приведенном ниже преобразовании). Всего два переопределения (последние два правила).
XSLT 1.0 протестирован под Saxon 6.5.5
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="name">
<brlName><xsl:value-of select="."/></brlName>
</xsl:template>
<xsl:template match="brlVersion">
<xsl:copy-of select="."/>
<drlName><xsl:value-of select="preceding-sibling::name"/>_1.0</drlName>
</xsl:template>
</xsl:stylesheet>
Ответ №2:
Это преобразование:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="name">
<brlName><xsl:apply-templates select="node()|@*"/></brlName>
</xsl:template>
<xsl:template match="/*/*[last()]">
<xsl:call-template name="identity"/>
<drlName>86_1.0</drlName>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному XML-документу:
<rule>
<name>86</name>
<ruleId>100</ruleId>
<ruleVersion>1.0</ruleVersion>
<brlVersion>1.0</brlVersion>
</rule>
выдает желаемый, правильный результат:
<rule>
<brlName>86</brlName>
<ruleId>100</ruleId>
<ruleVersion>1.0</ruleVersion>
<brlVersion>1.0</brlVersion>
<drlName>86_1.0</drlName>
</rule>
Объяснение:
-
Использование и переопределение правила идентификации / шаблона — наиболее фундаментального и мощного шаблона проектирования XSLT.
-
Переопределение любого элемента с именем
name
и создание элемента с именемbrlName
(переименовать). -
Переопределить последний дочерний элемент верхнего элемента. Вызов правила идентификации по имени для этого узла (копирование) и затем создание элемента с именем
drlName
с определенным дочерним текстовым узлом в соответствии с требованиями.
Использование и переопределение правила идентификации / шаблона является наиболее фундаментальным и мощным шаблоном проектирования XSLT. Вы можете узнать больше об этом здесь.