使用xsltproc(XSL样式表)

时间:2016-08-21 13:52:08

标签: tomcat xslt

我正在尝试使用$CATALINE_HOME/conf/tomcat-users.xml脚本bashxsltproc添加到tomcat-users.xml,如下所示(xsltproc --stringparam username test1 \ --stringparam password test2 \ add-tomcat-user.xslt tomcat-users.xml 是Apache Tomcat 9附带的默认版本) :

<?xml version="1.0"?>
<!-- (unmodified comments -->
<tomcat-users xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instaance">
<!-- (unmodified comments -->
<user username="$username" password="$password" roles="manager-gui"/></tomcat-users>

几乎使用此输出:

add-tomcat-users.xslt

我的XSLT文件<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:tomcat="http://tomcat.apache.org/xml"> xmlns="http://tomcat.apache.org/xml"> <xsl:output method="xml" indent="yes"/> <xsl:param name="username"/> <xsl:param name="password"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="tomcat:tomcat-users"> <xsl:copy> <xsl:apply-templates/> <user username="$username" password="$password" roles="manager-gui"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 如下:

xsl:param

仍有三个问题:

  • 未正确替换XSL参数。为什么(尽管indent="yes")?
  • 插入元素的缩进不正确?为什么(尽管tomcat)?
  • 我可以避免必须两次定义相同的命名空间(一次用于前缀<xsl:template match="tomcat:tomcat-users">,一次用作默认命名空间),而http://tomcat.apache.org/xml仍然成功,输出仍然使用add-tomcat-user.xslt作为默认值命名空间?

那么我怎样才能解决问题(通过将xsltproc或命令行选项更改为SELECT Store, SUM(CASE WHEN Month = 1 THEN Revenue ELSE NULL END) AS REVENUE_JAN, SUM(CASE WHEN Month = 2 THEN Revenue ELSE NULL END) AS REVENUE_FEB, (SUM(CASE WHEN Weekday = 4 THEN Revenue END) / COUNT(DISTINCT CASE WHEN Weekday = 4 THEN Date END) ) AS REVENUE_THU, (SUM(CASE WHEN Weekday = 5 THEN Revenue END) / COUNT(DISTINCT CASE WHEN Weekday = 5 THEN Date END) ) AS REVENUE_FRI FROM Table1 GROUP BY Store; )?

1 个答案:

答案 0 :(得分:1)

使用属性值模板<tomcat:user username="{$username}" password="{$password}" roles="manager-gui"/>设置属性值。您可以简单地使用<user username="{$username}" password="{$password}" roles="manager-gui"/>,但是在XSLT中给出了默认的名称空间声明。

至于两次不声明相同的命名空间,即使使用XSLT 2.0处理器,您也需要使用两个属性,一个说xpath-default-namespace="http://tomcat.apache.org/xml"(然后允许你使用<xsl:template match="tomcat-users">...</xsl:template>),另一个以您的方式(xmlns="http://tomcat.apache.org/xml")声明结果元素的默认命名空间。因此,除非您想使用<xsl:template match="*[local-name() = 'tomcat-users' and namespace-uri() = 'http://tomcat.apache.org/xml']">...</xsl:template><xsl:template match="*[local-name() = 'tomcat-users']">...</xsl:template>,否则我认为没有一种简洁的方法可以避免您拥有的内容。因此,这不会给您带来太多的简化,并且在匹配方面可能效率较低。