2012-06-08 2 views
0

Можете ли вы поделиться XSLT со мной, которая достигает следующего, пожалуйста?Замените префиксы пространства имен областями пространства имен по умолчанию с использованием XSLT

Вход:

<alfa data="abc" xmlns="http://test1.com/"> 
    <mus:beta xmlns:mus="http://test2.com"> 
    <mus:a>1234567897</mus:a> 
    <mus:s>777666</mus:s> 
    </mus:beta> 
</alfa> 

Вывод должен быть:

<alfa data="abc" xmlns="http://test1.com/"> 
    <beta xmlns="http://test2.com"> 
    <a>1234567897</a> 
    <s>777666</s> 
    </beta> 
</alfa> 

На самом деле; вход генерируется с помощью XmlBeans; Я не могу добиться вывода с помощью xmlbeans; Поэтому я сделаю преобразование с xslt в медиации; однако мне нужно сначала xslt :) Решение XmlBeans также приемлемо. :)

Для пользователей xmlbeans; Ниже не работает, FYI:

Map map = new HashMap(); 
map.put("http://test1.com/",""); 
map.put("http://test2.com/",""); 
xo.setSaveSuggestedPrefixes(map); 

Приветствия, Каан

ответ

1

Вот таблица стилей:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:mus="http://test2.com" 
    exclude-result-prefixes="mus" 
    version="1.0"> 

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

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

</xsl:stylesheet> 
+0

Thanks Martin! Обратите внимание на синтаксическую ошибку: namespace = "{namespace-uri (.)}". Для разработчиков Java: Xalan не дает правильного преобразования; Однако Саксон. Stylus Studio также работает с этим xsl. Поэтому я считаю, что что-то смущает Xalan: конфигурация или ошибка; Я не знаю. –

+0

Извините за синтаксическую ошибку. –

1

Если вы явно добавить объявление пространства имен в документе, XMLBeans будет уважать его. Вы можете добавить новый документ по умолчанию в середине документа с помощью API XmlCursor. Например,

XmlObject xobj = XmlObject.Factory.parse(
      "<a xmlns='testA'>\n" + 
      " <B:b xmlns:B='testB'>\n" + 
      " <B:x>12345</B:x>\n" + 
      " </B:b>\n" + 
      "</a>"); 

    // Use xpath with namespace declaration to find <B:b> element. 
    XmlObject bobj = xobj.selectPath(
      "declare namespace B='testB'" + 
      ".//B:b")[0]; 

    XmlCursor cur = null; 
    try 
    { 
     cur = bobj.newCursor(); 
     cur.removeAttribute(new QName("http://www.w3.org/2000/xmlns/", "B")); 
     cur.toNextToken(); 
     cur.insertNamespace("", "testB"); 
    } 
    finally 
    { 
     cur.dispose(); 
    } 

    System.out.println(xobj.xmlText()); 
+0

Ницца! Можно ли пропустить шаг selectPath()? – Withheld

+1

Да, это можно пропустить. Если у вас уже есть XmlObject в руке, просто используйте это. Я просто использовал selectPath(), чтобы быстро захватить желаемый объект XmlObject. –

+0

Спасибо. Мне действительно нужен запрос selectPath(), но с пространством имен ** по умолчанию **, для которого [я не нашел правильного синтаксиса] (http://stackoverflow.com/q/19792820/1864054). Есть ли способ сделать это? – Withheld

Смежные вопросы