2015-03-10 3 views
0

Я пытаюсь удалить некоторые элементы из xml с помощью xsl, а также в изменить значение пространства имен, объявленное в элементе sub1. Проблема в том, что когда я изменяю значение пространства имен, старое объявление пространства имен вставляется в дочерний элемент (sub2 в примере), как я могу изменить код, чтобы предотвратить его?XSL XML-преобразование, изменение значения пространства имен

Я сделал этот пример, потому что я не могу показать реальный код

test.xml

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet version="1.0" href="test.xsl"?> 
<lamp:rootElement xmlns:lamp="adgfdgfhdsadfse"> 
<pref:sub1 ID="someId" xmlns:pref="http://www.myMountain.org/blabla"> 
    <pref:sub2> 
    Today is tuesday 
     <pref:sub3 att="someAttribute"> 
     Some text 
      <pref:sub4> 
       <pref:emptyElement/> 
      </pref:sub4> 
     </pref:sub3> 
    </pref:sub2> 
</pref:sub1> 
</lamp:rootElement> 

test.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:oldPref="http://www.myMountain.org/blabla" 
xmlns:pref="http://www.myHill.org/blabla" 
exclude-result-prefixes="oldPref"> 

<!-- For deleting element "sub4" --> 
<xsl:template match="oldPref:sub1/oldPref:sub2/oldPref:sub3/oldPref:sub4"/> 

<!-- Now i'm replacing the value of "pref" namespace (by creating a new element) --> 
<xsl:template match="oldPref:sub1"> 

    <pref:sub1> 
     <!-- Now i'm copying the elements from old "sub1" to the new one --> 
     <xsl:apply-templates select="@*|node()"/> 
    </pref:sub1> 

</xsl:template> 

<!-- Now im copying the rest of the xml file --> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

неправильный результат, который я получаю result.xml

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet version="1.0" href="test.xsl"?> 
<lamp:rootElement xmlns:lamp="adgfdgfhdsadfse"> 
<pref:sub1 xmlns:pref="http://www.myHill.org/blabla" ID="someId"> 
    <pref:sub2 xmlns:pref="http://www.myMountain.org/blabla"> 
    Today is tuesday 
     <pref:sub3 att="someAttribute"> 
     Some text 

     </pref:sub3> 
    </pref:sub2> 
</pref:sub1> 
</lamp:rootElement> 

желаемого результата

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet version="1.0" href="test.xsl"?> 
<lamp:rootElement xmlns:lamp="adgfdgfhdsadfse"> 
<pref:sub1 xmlns:pref="http://www.myHill.org/blabla" ID="someId"> 
    <pref:sub2> 
    Today is tuesday 
     <pref:sub3 att="someAttribute"> 
     Some text 

     </pref:sub3> 
    </pref:sub2> 
</pref:sub1> 
</lamp:rootElement> 

Мой саксонской

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.9.4 
Project-Name: Saxon-HE 
Created-By: 1.7.0_05-b06 (Oracle Corporation) 
Main-Class: net.sf.saxon.Transform 

Это команда, я использую

java net.sf.saxon.Transform -s:test.xml -xsl:test.xsl -o:result.xml 
+0

Обратите внимание, что Saxon HE поддерживает XSLT 2.0, так что он не делает много смысла, чтобы пометить вопрос как «саксон» и «xslt-1.0» –

+0

И если вы хотите узнать, какую версию Saxon вы используете, запустите ее из командной строки с опцией -t. –

ответ

1

Проблема здесь состоит в том, что вы изменяете пространство имен на pref:sub1, но не на любой из других элементов pref:. Вам нужно что-то более общее:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:oldPref="http://www.myMountain.org/blabla" 
       xmlns:pref="http://www.myHill.org/blabla" 
       exclude-result-prefixes="oldPref"> 

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

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

    <xsl:template match="oldPref:sub4" /> 

</xsl:stylesheet> 

При запуске на своем входе пробы, результат:

<?xml-stylesheet version="1.0" href="test.xsl"?> 
<lamp:rootElement xmlns:lamp="adgfdgfhdsadfse"> 
    <pref:sub1 ID="someId" xmlns:pref="http://www.myHill.org/blabla"> 
    <pref:sub2> 
     Today is tuesday 
     <pref:sub3 att="someAttribute"> 
     Some text 

     </pref:sub3> 
    </pref:sub2> 
    </pref:sub1> 
</lamp:rootElement> 
Смежные вопросы