2012-06-01 1 views
1

Я работаю над шаблоном вызова, где источник выглядит так.Обработка различных пространств имен для шаблона вызова в xslt

Источник:

<Content> 
     <first> 
       <text> 
       Text 
      </text> 
      <link xmlns="Some namespace"> 
       <AA>abcd</AA> 
       <BB>hi all</BB> 
      </link> 
     </first> 

     <second> 
     <link xmlns="Some other namespace"> 
       <AA>abcd1</AA> 
       <BB>hi all21</BB> 
      </link> 
     </second> 

      <three> 
     <link xmlns="other namespace"> 
       <AA>abcd2</AA> 
       <BB>hi all33</BB> 
      </link> 
     </three> 
    </Content> 

XSLT написано:

  <?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:n1="Some namespace" xmlns:n2="Some other namespace" xmlns:n3="other namespace"> 
     <xsl:output method="xml" indent="yes"/> 

     <xsl:template match="Content"> 
     <xsl:call-template name="process"> 
     <xsl:with-param name="item" select="first/n1:link" /> 
    </xsl:call-template> 
     <xsl:call-template name="process"> 
     <xsl:with-param name="item" select="second/n2:link" /> 
    </xsl:call-template> 
     <xsl:call-template name="process"> 
     <xsl:with-param name="item" select="three/n3:link" /> 
    </xsl:call-template> 


     </xsl:template> 

     <xsl:template name="process"> 
     <xsl:param name="item" /> 
     <xsl:value-of select="$item/AA" /> 
     </xsl:template> 

    </xsl:stylesheet> 

Я получаю пустой output.I знаю причину, потому что я не добавляет префикс пространства имен для него. как «n1: A».

Как поступает несколько раз. Я написал шаблон и позвонил туда, где это было необходимо. Но пространство имен каждой ссылки отличается. Как мне изменить свой код, чтобы я мог повторно использовать шаблон «процесс».

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

спасибо.

+0

Атрибут 'namespace =' не содержит пространства имен XML. Это просто атрибут, поэтому он ищет его ('select ='), поскольку пространство имен в вашем XSL не будет работать. Что касается ответа, вам придется подождать, пока ваш XML будет исправлен. –

+0

@ Jim Garrison. Извините за неправильный ввод. Я отредактировал вопрос. – Patan

ответ

0

Вместо того чтобы делать это

<xsl:value-of select="$item/AA" /> 

Вы можете изменить выражение этого

<xsl:value-of select="$item/*[local-name() = 'AA'][namespace-uri()=namespace-uri($item)]" /> 

т.е. Проверьте имя без пространства имен «AA», и что он имеет такое же пространство имен в качестве родителя элемент. Это означало бы, если бы у вас был еще один элемент «АА» в элементе «link» с другим пространством имен, он не был бы поднят.

+0

Благодарим вас за ответ. – Patan

0

Стоит отметить, что это плохо разработанный XML-документ. Всякий раз, когда вы видите, что кто-то создает два пространства имен N1 и N2, так что локальные имена в N1 совпадают с локальными именами в N2, вы должны обнаружить дизайнерский запах. Они делают XML намного сложнее для людей.

Когда я вижу этот тип ввода (иногда возникает случай, когда люди ошибочно меняют URI пространства имен для версии 2 своего словаря). Я обычно считаю, что лучший подход к его обработке - написать конвейер, в котором первая фаза для нормализации пространств имен, так что «реальная» логика обработки не должна иметь дело с несколькими пространствами имен в том, как работает ваш код, который всегда заканчивается похожим на спагетти.

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

  • Нет связанных вопросов^_^