2016-12-20 2 views
0

Я знаю, что это простая проблема. Я все еще учусь и ознакомлюсь с кодировкой XSLT. У меня проблема в XSLT, и я не знаю, правильно ли я это сделал. Мне нужно получить значение из входного файла и сохранить его в имени тега нового элемента и что мне не нужно заполнять пространства имен и атрибуты, что находится на родительском корневом элементе. Я сделал исследование об этом, и я видел много ссылок, но я не могу его применить. XSLT (v02), который я создал, работает нормально (просто копируйте из ссылок), если корневой элемент не имеет пространств имен и атрибутов. Но, когда я помещаю пространства имен и атрибута, никакого выхода не заполняется.Невозможно прочитать пространства имен и атрибут в xslt

входного файла

<Root xmlns="http://abcd.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" releaseID="9.2" versionID="2.12.3" xsi:schemaLocation="abcd.com abcd.xsd"> 
    <Element> 
     <Field>AAAAA</Field> 
    </Element> 
    <Element> 
     <Field>BBBBB</Field> 
    </Element> 
    <Element> 
     <Field>CCCCC</Field> 
    </Element> 

файл XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:template match="/"> 
    <NewRecord> 
     <xsl:for-each select="Root/Element"> 
      <NewTransaction> 
       <Position> 
        <xsl:value-of select="position()"/> 
       </Position> 
       <TransactionID> 
        <xsl:value-of select="Field"/> 
       </TransactionID> 
      </NewTransaction> 
     </xsl:for-each> 
    </NewRecord> 
</xsl:template> 

вывод, сгенерированный

<NewRecord/> 

Мой ожидаемый результат должен выглядеть следующим образом:

<NewRecord> 
<NewTransaction> 
    <Position>1</Position> 
    <TransactionID>AAAAA</TransactionID> 
</NewTransaction> 
<NewTransaction> 
    <Position>2</Position> 
    <TransactionID>BBBBB</TransactionID> 
</NewTransaction> 
<NewTransaction> 
    <Position>3</Position> 
    <TransactionID>CCCCC</TransactionID> 
</NewTransaction> 

Я думаю, что проблема в <xsl:template match="/">, я до сих пор путают на узлах, что мне нужно положил. Спасибо за помощь.

+0

Возможный дубликат [XSLT с источником XML, который имеет пространство имен по умолчанию, установленное в xmlns] (http://stackoverflow.com/questions/1344158/xslt-with-xml-source-that-has-a-default-namespace -set-to-xmlns) – teppic

+0

Почему ваша таблица стилей объявляет 'version =" 1.0 "', когда ваш вопрос помечен 'xslt-2.0'? –

+0

@michael. hor257k, я забыл изменить версию, но я действительно использую v02. Спасибо. –

ответ

1

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

xpath-default-namespace="http://abcd.com" 

к stylesheet тегу, и все остальное оставьте как есть.

+0

Привет, большое спасибо. Это сработало. –

1

Если вы используете XSLT 1.0, вы должны объявить то же пространство имен в таблице стилей, и использовать префикс, карту в пространстве имен квалифицировать имена элементов:

Приставка может быть все что пожелаете. Я выбрал abcd, чтобы соответствовать вашему примеру, но это может быть любой юридический идентификатор.

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:abcd="http://abcd.com"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <NewRecord> 
      <xsl:for-each select="abcd:Root/abcd:Element"> 
       <NewTransaction> 
        <Position> 
         <xsl:value-of select="position()"/> 
        </Position> 
        <TransactionID> 
         <xsl:value-of select="abcd:Field"/> 
        </TransactionID> 
       </NewTransaction> 
      </xsl:for-each> 
     </NewRecord> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Привет, благодарю вас за отзыв. –