Замените значение атрибута неизвестным пространством имен, используя XSLT - PullRequest
0 голосов
/ 02 августа 2011

У меня есть XML от клиента, где я не могу быть уверен в пространстве имен.Мне нужно заменить значение некоторого атрибута.Вот пример входного XML:

<?xml version="1.0" encoding="UTF-8"?>
<NetworkSection xmlns:ovf="http://com/deployment/1.0">
    <Network ovf:name="bridged"/>
</NetworkSection>

Я хочу получить XML следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<NetworkSection xmlns:ovf="http://com/deployment/1.0">
    <Network ovf:name="VM network"/>
</NetworkSection>

Вот XSL, который я пытаюсь использовать:

<?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" encoding="utf-8"/>
  <xsl:template match="NetworkSection/Network/@*[local-name()='name']">
    <xsl:attribute name='name'>VM Network</xsl:attribute>
  </xsl:template>

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

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

Можно ли выполнить такую ​​замену без указания пространства имен в XSL?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 02 августа 2011

Мой предпочтительный подход к этой проблеме - двухпроходное решение: сначала нормализуйте пространства имен, затем выполните «реальную» обработку. Преимущество этого заключается в том, что шаг нормализации в конвейере можно повторно использовать независимо от того, какую последующую обработку вы хотите выполнить, и это всегда облегчит последующую обработку.

0 голосов
/ 02 августа 2011

Этого можно добиться с помощью функций name () и namespace-uri () .

<xsl:attribute name="{name()}" namespace="{namespace-uri()}">VM Network</xsl:attribute>

Когда вы используете эту строку в вашемXSLT, вы должны получить желаемый результат

<Network ovf:name="VM network"/> 
...