Как заменить элемент на XSLT, сохранив префикс пространства имен - PullRequest
0 голосов
/ 24 января 2012

Я ищу способ заменить значение поля из XML-файла с помощью xslt.Все отлично работает, кроме префикса пространства имен.В исходном файле ниже я хочу изменить значение элемента 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>
                    <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>

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

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

1 Ответ

0 голосов
/ 24 января 2012

Мне не ясно, хотите ли вы, чтобы элемент Password принадлежал пустому пространству имен в том виде, в каком он отображается в исходном XML, или вы хотите, чтобы он находился в пространстве имен http://www.me.com/myxml.Вот таблица стилей Xslt, которая заменяет элемент Password из пустого пространства имен элементом Password из пространства имен 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...