2017-01-05 5 views
0

У меня есть такой простой XML для тестаXLS преобразование - игнорировать пространства имен

<test xmlns="urn:entsoe.eu:wgedi:ecan:totalallocationresultsdocument:6:0"> 
    <Domain v="old"/> 
</test> 

и это XSL преобразование

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

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

    <xsl:template match="Domain/@v[.='old']"> 
     <xsl:attribute name="v" > 
      <xsl:value-of select="'New'"/> 
     </xsl:attribute> 
    </xsl:template>  
</xsl:stylesheet> 

Мне нужно заменить «старое» значение на элементе домена, чтобы «Новый» значение , Это отлично работает, если я удалю xmlns-тег в образце xml. Но в случае представления xmlns преобразование не работает. Есть ли какой-либо параметр конфигурации, чтобы игнорировать xmlns или каким-либо другим способом, как заставить его работать?

Благодаря

+0

Пожалуйста, поиск «пространства имен XSLT по умолчанию», и вы найдете 1000 ответов на этот вопрос. –

ответ

1

В «XMLNS» представляет декларацию пространства имен по умолчанию, и это на самом деле не то, что вы должны игнорировать, но вместо этого вы должны изменить XSLT для учета этого пространства имен.

Поскольку вы используете XSLT 2.0, этого можно достичь, используя xpath-default-namespace. Это будет означать, что любые элементы в ваших выражениях xpath, которые не имеют префикса пространства имен, будут обрабатываться так, как если бы они находились в указанном пространстве имен.

Попробуйте этот XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="urn:entsoe.eu:wgedi:ecan:totalallocationresultsdocument:6:0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

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

    <xsl:template match="Domain/@v[.='old']"> 
     <xsl:attribute name="v" > 
      <xsl:value-of select="'New'"/> 
     </xsl:attribute> 
    </xsl:template>  
</xsl:stylesheet> 

EDIT: Если вы действительно не знаете, что пространство имен будет, вы можете использовать маску для префикса пространства имен в XSLT 2.0.

Попробуйте это слишком

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

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

    <xsl:template match="*:Domain/@v[.='old']"> 
     <xsl:attribute name="v" > 
      <xsl:value-of select="'New'"/> 
     </xsl:attribute> 
    </xsl:template>  
</xsl:stylesheet> 
+0

Спасибо, Тим, но моя цель немного сложна, так как я не знаю окончательного подсчета пространств имен xmlns. Мои входные XML-файлы могут иметь разные xmlns, а также некоторые XML не могут иметь xmlns. Вы не знаете, как это решить? –

+0

Я изменил свой ответ, чтобы показать, как вы можете использовать подстановочный знак для соответствия любому пространству имен. –

+0

Спасибо большое Тим. –