xslt установить значение узла в родительской группе - PullRequest
1 голос
/ 10 января 2011

Образец входного XML-файла:

<sample>    
    <vars>    
        <var>    
            <name>connection1</name>    
            <value>tcp</value>    
        </var>    
        <var>    
            <name>connection2</name>    
            <value>ssl</value>    
        </var>    
    </vars>    
</sample>

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

например, найти name = connection1 и установить значение, находящееся в той же группе, на SSL

Output

 <sample>    
    <vars>    
        <var>    
            <name>connection1</name>    
            <value>ssl</value>    
        </var>    
        <var>    
            <name>connection2</name>    
            <value>ssl</value>    
        </var>    
    </vars>    
</sample>

Ответы [ 4 ]

1 голос
/ 10 января 2011

Вероятно, самое короткое решение - это :

<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=
 "var[name='connection1']/value/text()">ssl</xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML :

<sample>
    <vars>
        <var>
            <name>connection1</name>
            <value>tcp</value>
        </var>
        <var>
            <name>connection2</name>
            <value>ssl</value>
        </var>
    </vars>
</sample>

желаемый, правильный результат получен :

<sample>
   <vars>
      <var>
         <name>connection1</name>
         <value>ssl</value>
      </var>
      <var>
         <name>connection2</name>
         <value>ssl</value>
      </var>
   </vars>
</sample>

Пояснение :

В этом решении используется самый фундаментальный шаблон проектирования XSLT: использование правила идентификации для копирования каждого узла как есть и его переопределения с помощью шаблона, соответствующего конкретному узлу, который нужно только изменить.

0 голосов
/ 10 января 2011

Вы можете использовать следующие XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="value[preceding-sibling::name = 'connection1']">
    <value>ssl</value>
  </xsl:template>
</xsl:stylesheet>
0 голосов
/ 10 января 2011

Используйте XSL Identity Transform вместе с шаблоном, который обрабатывает ваш конкретный случай и заменяет ssl на tcp.

0 голосов
/ 10 января 2011
<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="var[name = 'connection1']/value">
  <xsl:copy>
    <xsl:text>ssl</xsl:text>
  </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...