2012-01-24 3 views
-2

Я ищу способ заменить значение поля из xml-файла с помощью xslt. Все работает отлично, кроме префикса пространства имен. В исходном файле ниже я хочу изменить значение элемента Password.Как заменить элемент XSLT, сохраняя префикс пространства имен

<?xml version="1.0" encoding="utf-8"?> 
<ns0:MYXML xmlns:ns0="http://www.me.com/myxml" xmlns="http://www.me.com/myxml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:Header> 
     <ns0:Infromation> 
      <ns0:From> 
       <ns0:Credential> 
        <ns0:User>jeff</ns0:User> 
        <Password xmlns="">OLD VALUE</Password> 
       </ns0:Credential> 
      </ns0:From> 
     </ns0:Infromation> 
     <ns0:Misc> 
      <ns0:ID>1002</ns0:ID> 
      <ns0:Timestamp>2012-01-16T09:23:33</ns0:Timestamp> 
      <ns0:Type>unknown</ns0:Type> 
     </ns0:Misc> 
     <ns0:State> 
      <ns0:ConversationId>d66d9304-9025-a580-e111-5640bf36560d</ns0:ConversationId> 
     </ns0:State> 
    </ns0:Header> 
</ns0:MYXML> 

Вот мой результат:

<?xml version="1.0" encoding="utf-8"?> 
<ns0:MYXML xmlns:ns0="http://www.me.com/myxml" xmlns="http://www.me.com/myxml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:Header> 
     <ns0:Infromation> 
      <ns0:From> 
       <ns0:Credential> 
        <ns0:User>jeff</ns0:User> 
        <Password xmlns="">New Value</Password> 
       </ns0:Credential> 
      </ns0:From> 
     </ns0:Infromation> 
     <ns0:Misc> 
      <ns0:ID>1002</ns0:ID> 
      <ns0:Timestamp>2012-01-16T09:23:33</ns0:Timestamp> 
      <ns0:Type>unknown</ns0:Type> 
     </ns0:Misc> 
     <ns0:State> 
      <ns0:ConversationId>d66d9304-9025-a580-e111-5640bf36560d</ns0:ConversationId> 
     </ns0:State> 
    </ns0:Header> 
</ns0:MYXML> 

И это код XSLT, который я использую для преобразования:

<?xml version="1.0" encoding="utf-8"?> 
<ns0:MYXML xmlns:ns0="http://www.me.com/myxml" xmlns="http://www.me.com/myxml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:Header> 
     <ns0:Infromation> 
      <ns0:From> 
       <ns0:Credential> 
        <ns0:User>jeff</ns0:User> 
        <Password xmlns="">New Value</Password> 
       </ns0:Credential> 
      </ns0:From> 
     </ns0:Infromation> 
     <ns0:Misc> 
      <ns0:ID>1002</ns0:ID> 
      <ns0:Timestamp>2012-01-16T09:23:33</ns0:Timestamp> 
      <ns0:Type>unknown</ns0:Type> 
     </ns0:Misc> 
     <ns0:State> 
      <ns0:ConversationId>d66d9304-9025-a580-e111-5640bf36560d</ns0:ConversationId> 
     </ns0:State> 
    </ns0:Header> 
</ns0:MYXML> 

я пытался использовать "{имя()}" для имя элемента, но это порождает исключение, что пространство имен не существует.

Любая помощь очень ценится!

+0

Дубликат Q: Пожалуйста, обратитесь это :: http://stackoverflow.com/questions/3147876/how-to-preserve-xml-namespace-in- xslt-output –

+2

Вы не сказали, какой результат вы хотите. Единственное, что мы знаем о вашем желаемом выходе, - это не то, что вы действительно получили. Перенесите вопрос. –

ответ

0

Мне не ясно, хотите ли вы, чтобы элемент Password принадлежал пустому пространству имен, как он отображается в исходном Xml, или вы хотите, чтобы он находился в пространстве имен http://www.me.com/myxml. Вот таблицы стилей XSLT, которая заменяет элемент Пароля из пустого пространства имен с помощью пароля элемента из http://www.me.com/myxml пространства имен (я использовал префикс ns0 так, что он выглядит, как и другие элементы в XML-документе):

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 

    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="Password"> 
    <ns0:Password xmlns:ns0="http://www.me.com/myxml"> 
     <xsl:copy-of select="@*"/> 
     <xsl:text>New Value</xsl:text> 
    </ns0:Password> 
    </xsl:template> 

    <!-- This creates the element in the empty namespace 
    <xsl:template match="Password"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:text>New Value</xsl:text> 
    </xsl:copy> 
    </xsl:template> 
    --> 
</xsl:stylesheet> 

Я также включен шаблон, который копирует существующий элемент Password и заменяет его значение на тот случай, если он вам нужен. Если вам это не нужно, вы можете полностью удалить блок. Вот результат преобразования:

<?xml version="1.0" encoding="utf-8"?> 
<ns0:MYXML xmlns:ns0="http://www.me.com/myxml" xmlns="http://www.me.com/myxml" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:Header> 
    <ns0:Infromation> 
     <ns0:From> 
     <ns0:Credential> 
      <ns0:User>jeff</ns0:User> 
      <ns0:Password>New Value</ns0:Password> 
     </ns0:Credential> 
     </ns0:From> 
    </ns0:Infromation> 
    <ns0:Misc> 
     <ns0:ID>1002</ns0:ID> 
     <ns0:Timestamp>2012-01-16T09:23:33</ns0:Timestamp> 
     <ns0:Type>unknown</ns0:Type> 
    </ns0:Misc> 
    <ns0:State> 
     <ns0:ConversationId>d66d9304-9025-a580-e111-5640bf36560d</ns0:ConversationId> 
    </ns0:State> 
    </ns0:Header> 
</ns0:MYXML> 

Pawel

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