XSLT Document 函数在 Maven POM 上返回空结果

标签 xslt maven pom.xml

您好!

我想通过文档函数从 XSLT 中的不同 Maven POM 中提取一些属性。脚本本身工作正常,但文档函数返回 POM 的空结果,只要我在 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> 

并且,为了完整起见,带有“bad”属性的 POM 摘录:

<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 代码中:

document(concat($artifactCoordinate,'-pom.xml'))/project/properties

名称projectproperties没有前缀。 XPath 始终将不带前缀的名称视为属于“无命名空间”。因此,找不到此类元素,也不会选择任何节点。

解决方案:将命名空间定义添加到您的 <xsl:stylesheet> 中,可以说:

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

然后重写引用someElement中的POM节点的任何表达式中的元素名称。至p:someElement 。例如:

document(concat($artifactCoordinate,'-pom.xml'))/p:project/p:properties

关于XSLT Document 函数在 Maven POM 上返回空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2735548/

相关文章:

java - Jsp servlet异常

java - slf4j & log4j2 maven 设置查询

java - maven 的 Crystal 报告 jar

python - 当不同的子元素名称匹配时如何连接子元素

java - 使用 Maven 连接多个独立的 Spring 应用程序

maven - 如何为maven中属性集下声明的属性设置类路径

java - 如何将本地 .m2 存储库的所有 Artifact 发布到 jfrog 存储库

java - 使用 AND 运算

xml - (xslt 1.0) 如何用 xml 中所有文本值中的一些字符串替换空格?

xml - 如果使用 xslt 的 xml 中不存在子节点,则删除父节点