2016-06-14 6 views
2

Я пытаюсь изменить порядок элементов в XML с помощью XSLT 1.0. Ниже представлен небольшой фрагмент XML.Переопределение XML-элементов не работает XSLT

<RIMSDB1 xmlns="http://kiris.nps21.org/xsd"> 
    <ROW> 
     <ReportID>1</ReportID> 
     <WKYMD>20160610</WKYMD> 
     <RunSystemDate>20160610032048</RunSystemDate> 
    </ROW> 
    <ROW> 
     <ReportID>2</ReportID> 
     <WKYMD>27869</WKYMD> 
     <RunSystemDate>495876043985778649</RunSystemDate> 
    </ROW> 

Это XSLT, который я использую для его преобразования.

<xsl:template match="*/ROW"> 
<xsl:copy> 
    <xsl:apply-templates select="@*" /> 
    <xsl:apply-templates select="WKYMD" /> 
    <xsl:apply-templates select="RunSystemDate" /> 
    <xsl:apply-templates select="ReportID" /> 
</xsl:copy> 

Проблема, когда я преобразовать я не получаю никаких изменений в порядке, но я удалить Xmlns = «http://kiris.nps21.org/xsd» от

<RIMSDB1 xmlns="http://kiris.nps21.org/xsd"> 

я получаю правильное преобразование, это:

<RIMSDB1> 

    <ROW> 
    <WKYMD>20160610</WKYMD> 
    <RunSystemDate>20160610032048</RunSystemDate> 
    <ReportID>1</ReportID> 
</ROW> 
    <ROW> 
    <WKYMD>27869</WKYMD> 
    <RunSystemDate>495876043985778649</RunSystemDate> 
    <ReportID>2</ReportID> 
</ROW> 

Может ли кто-нибудь пролить свет на то, что происходит, если есть лучший способ изменить порядок.

Заранее спасибо.

ответ

2

Когда ваш исходный документ содержит xmlns="http://kiris.nps21.org/xsd", тогда все ваши элементы (без префикса пространства имен или переопределение объявления пространства имен) наследуют это пространство имен и привязаны к пространству имен http://kiris.nps21.org/xsd. Иногда бывает трудно заметить или понять, когда нет префикса пространства имен.

Вы должны настроить XSLT, чтобы объявить это пространство имен префиксом, а затем настроить выражения select и match, чтобы использовать префикс пространства имен, чтобы правильно адресовать эти элементы.

Например:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:k="http://kiris.nps21.org/xsd" 
    version="1.0"> 
    <xsl:template match="*/k:ROW"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*" /> 
      <xsl:apply-templates select="k:WKYMD" /> 
      <xsl:apply-templates select="k:RunSystemDate" /> 
      <xsl:apply-templates select="k:ReportID" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

@ Мадс-что работало для меня, но я столкнулся с каким-то другим вопросом. Как справиться с этим с пространством имен в обоих родительских и дочерних тегов, например ' \t \t \t \t \t \t \t \t \t \t \t \t 20160610032048 \t \t \t \t \t \t \t \t \t \t \t \t \t 495876043985778649 \t \t \t ' –

+0

В этом примере, элементы остроумия h xmlns = "" помещаются в "no namespace", и теперь он и его потомки НЕ находятся в пространстве имен, объявленном в элементе документа. Для тех, кто не имеет пространства имен, вы не используете префикс пространства имен в выражениях select/match. –

+0

Если ваш вход не является стандартным, и вы не уверены, когда/в каком пространстве имен будут привязаны элементы, вы можете использовать более общее выражение соответствия, которое заботится только о local-name() и не имеет никакого отношения к пространству имен, URI(). Например, * [local-name() = 'WKYMD'] –