2013-09-25 4 views
2

В моем xml пространство имен http://abc.com/source/error должно быть заменено на http://abc.com/error/i1. Я должен использовать xslt1.0, и очень сложно заменить часть uri в одиночку. Все остальные должны быть такими же, как на выходе. Если это пространство имен отсутствует, входной XML-код должен быть передан как вывод.xslt-replace namespace uri alone

Мой ввод XML

<a xmlns:hj="http://abc.com/source/error"> 
<hj:b>sam</hj:b> 
</a> 

ожидается выход

<a xmlns:hj="http://abc.com/source/error/i1"> 
<hj:b>sam</hj:b> 
</a> 

ответ

0

Это XSLT будет делать эту работу. Но помните, это работает только, если префикс пространства имен входного XML равно hj:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:hjold="http://abc.com/source/error" xmlns:hj="http://abc.com/source/error/i1" exclude-result-prefixes="hjold"> 
    <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="a[namespace-uri-for-prefix('hj', /*) != '']"> 
     <a xmlns:hj="http://abc.com/source/error/i1"> 
      <xsl:apply-templates select="@*|node()" /> 
     </a> 
    </xsl:template> 

    <xsl:template match="hjold:*" > 
     <xsl:element name="hj:{local-name()}"> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="*" > 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Для использования в XSLT 1.0 и пространства имен не имеет значения на выходе, даже если не было имен объявлено, изменение:

<xsl:template match="a[namespace-uri-for-prefix('hj', /*) != '']"> 

в

<xsl:template match="a"> 
+0

Спасибо. Префикс пространства имен не должен иметь значения для xslt. Даже xml, sam должен работать. Кроме того, версия xslt 1.0 – Suresh

+0

Извините, но если вы хотите использовать ее в XSLT 1.0, а пространство имен не имеет значения, является ли оно результатом или нет, измените ' 'to' ' –

+0

mark, входной XML-элемент может быть чем угодно , то есть элементы могут быть любого числа. Необходимо заменить только пространство имен. – Suresh