Функция Документа XSLT возвращает пустой результат на АНГЛИЧАНИНЕ Знатока

Поздравления!

Я хочу извлечь некоторые свойства от различных АНГЛИЧАН Знатока в XSLT через функцию документа. Сам сценарий хорошо работает, но функция документа возвращает пустой результат для АНГЛИЧАНИНА, пока у меня есть xmlns = "http://maven.apache.org/POM/4.0.0" в теге проекта. Если я удаляю его, все хорошо работает.

Какая-либо идея, как делание этой работы при отъезде xmlns приписывает, где это принадлежит или почему это не работает с атрибутом на месте?

Здесь прибывает соответствующая часть моего XSLT:

<xsl:template match="abcs">
 <xsl:variable name="artifactCoordinate" select="abc"/>
   <xsl:choose>
        <xsl:when test="document(concat($artifactCoordinate,'-pom.xml'))">
         <abc>
          <ID><xsl:value-of select="$artifactCoordinate"/></ID>
    <xsl:copy-of select="document(concat($artifactCoordinate,'-pom.xml'))/project/properties"/>
   </abc>
         </xsl:when>
            <xsl:otherwise>
       <xsl:message terminate="yes">
           Transformation failed: POM "<xsl:value-of select="concat($artifactCoordinate,'-pom.xml')"/>" doesn't exist. 
       </xsl:message>
      </xsl:otherwise> 

</xsl:choose> 

И, для полноты, извлечения АНГЛИЧАНИНА с "плохим" атрибутом:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- ... -->
<properties>
    <proalpha.version>[5.2a]</proalpha.version>
    <proalpha.openedge.version>[10.1B]</proalpha.openedge.version>
    <proalpha.optimierer.version>[1.1]</proalpha.optimierer.version>
    <proalpha.sonic.version>[7.6.1]</proalpha.sonic.version>
</properties>
 </project>
6
задан Ondra Žižka 24 August 2010 в 22:11
поделиться

3 ответа

Ваша проблема в том, что извлечение POM использует пространство имен по умолчанию . Это означает, что элементы, хотя и без префикса, находятся в « http://maven.apache.org/POM/4.0.0 », а не в «без пространства имен».

Однако в этом выражении XPath в коде XSLT:

 документ (concat ($ artifactCoordinate, '- pom.xml')) / project / properties 
 

имена свойства проекта и не имеют префикса. XPath всегда рассматривает имена без префикса как принадлежащие «без пространства имен». Следовательно, такие элементы не найдены и узел не выбран.

Решение : добавьте определение пространства имен в свой , скажем:

  xmlns:p="http://maven.apache.org/POM/4.0.0"

Затем перепишите имена элементов в любых выражениях, ссылающихся на узлы POM из someElement to p: someElement . Например:

document(concat($artifactCoordinate,'-pom.xml'))/p:project/p:properties
11
ответ дан 8 December 2019 в 15:59
поделиться

Это проблема пространства имен. xmlns = "http://maven.apache.org/POM/4.0.0" в исходном документе означает, что все элементы по умолчанию помещаются в " http: // maven .apache.org / POM / 4.0.0 "в XML-документе.

Если вы хотите получить их в своем xslt, вам необходимо объявить это пространство имен в своем xslt (с префиксом или без него), а затем использовать это пространство имен при выборе элементов.

Например, я предполагаю, что шаблон в вашем примере предназначен для соответствия элементу «abcs» в вашем POM, да? Попробуйте добавить объявление пространства имен в вашу таблицу стилей xsl:, например:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:pom="http://maven.apache.org/POM/4.0.0" version="1.0">

Это говорит XSL: «Я хочу добавить 'pom' в качестве префикса, который идентифицирует ' http://maven.apache.org/POM /4.0.0 'в этом документе. "

Затем, выбирая элементы или соответствующие шаблоны, используйте этот префикс, например:

<xsl:template match="pom:abcs">

Или попробуйте его без префиксов, объявив свою таблицу стилей с пространством имен POM по умолчанию , что-то вроде:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://maven.apache.org/POM/4.0.0" version="1.0">
3
ответ дан 8 December 2019 в 15:59
поделиться

Узлы могут (при использовании XSLT 2.0+) также обращаться через *, поскольку они находятся в другом пространстве имен.

    <xsl:copy-of select="document(concat($artifactCoordinate,'-pom.xml'))/*:project/*:properties)"/> 

Это может быть просто удобно или особенно полезно, если пространство имен неизвестно. В этом случае приятным побочным эффектом является то, что если пространство имен обозначено таким образом, то узлы из другого пространства имен не получают аннотации - что в нашем случае нежелательно.

1
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: