Поздравления!
Я хочу извлечь некоторые свойства от различных АНГЛИЧАН Знатока в 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>
Ваша проблема в том, что извлечение 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
Это проблема пространства имен. 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">
Узлы могут (при использовании XSLT 2.0+) также обращаться через *, поскольку они находятся в другом пространстве имен.
<xsl:copy-of select="document(concat($artifactCoordinate,'-pom.xml'))/*:project/*:properties)"/>
Это может быть просто удобно или особенно полезно, если пространство имен неизвестно. В этом случае приятным побочным эффектом является то, что если пространство имен обозначено таким образом, то узлы из другого пространства имен не получают аннотации - что в нашем случае нежелательно.