Вы правы: причина, по которой ваше преобразование не работает, заключается в том, что у вас есть объявление пространства имен для элемента tells
.
Чтобы устранить эту конкретную проблему, вам нужно, чтобы ваш XSLT знал о пространстве имен и сообщил ему, что элемент tells
, который он пытается преобразовать, принадлежит этому пространству имен.Наиболее распространенный способ сделать это - объявить префикс пространства имен в элементе xsl:stylesheet
, а затем использовать этот префикс в XPath, например:
<xsl:stylesheet xmlns:n="http://dl.kr.org/dig/2003/02/lang" ... >
...
<xsl:template match="/">
<output>
<xsl:apply-templates select="//n:tells"/>
</output>
</xsl:template>
<xsl:template match="n:tells">
...
</xsl:template>
<xsl:stylesheet>
Атрибут xmlns:n
в верхней частиТаблица стилей сообщает процессору XSLT, что пространство имен 'http://dl.kr.org/dig/2003/02/lang' существует, и что префикс n:
является его сокращением.В атрибутах select
и match
префикс n:
сообщает процессору XSLT, что при поиске элементов с именем tells
он должен искать элементы с таким именем, которые находятся в пространстве имен http://dl.kr.org/dig/2003/02/lang
.
Пространства имен XML являются неотъемлемой частью технологий XML, и люди часто упускают их из виду, когда изучают XML - они сложные и не очень интуитивно понятные, и вы можете игнорировать их довольно долго, когда будете подходитьускорить на XML.Но наступает момент, когда вы больше не можете себе позволить упрощенное предположение, что пространства имен не существуют, и вы на этом этапе.