无重复元素 XSLT
No duplicated element XSLT
我想插入以下安全约束
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>AcctAdminRole</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
在新的 XML 应用 xslt 中仅一次,仅针对角色名称:AcctAdminRole。
这是我的 XML:
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="BLA"
version="2.5">
<listener>
<listener-class>com.example</listener-class>
</listener>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>report.pdf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/config/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
在这个xsl文件中,我控制只添加一次,但是添加了多次,我不知道如何只在role-name为AcctAdminRole时应用。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ee="http://java.sun.com/xml/ns/javaee"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="ee xs fn">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ee:web-app">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:if test="not(security-constraint)">
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>AcctAdminRole</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
感谢大家
如果您将 XSLT 应用到一个 XML,其中已经有一个 security-constraint
节点,您需要考虑命名空间。您的 XSLT 将 security-constraint
添加到命名空间“http://java.sun.com/xml/ns/javaee”,但 xsl:if
正在检查没有命名空间的 security-constraint
。
有两种方法可以解决这个问题。一种方法是向 xsl:if
test
添加名称空间前缀
<xsl:if test="not(ee:security-constraint)">
或者,当您使用 XSLT 2.0 时,您可以使用 xpath-default-namespace
来指示用于 xpath 表达式中任何无前缀元素的名称空间
<xsl:stylesheet version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ee="http://java.sun.com/xml/ns/javaee"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xpath-default-namespace="http://java.sun.com/xml/ns/javaee"
exclude-result-prefixes="ee xs fn">
您可能还想考虑在模板匹配中对 security-constraint
进行测试。
试试这个 XSLT
<xsl:stylesheet version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ee="http://java.sun.com/xml/ns/javaee"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xpath-default-namespace="http://java.sun.com/xml/ns/javaee"
exclude-result-prefixes="ee xs fn">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="web-app[not(security-constraint)]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>AcctAdminRole</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我想插入以下安全约束
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>AcctAdminRole</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
在新的 XML 应用 xslt 中仅一次,仅针对角色名称:AcctAdminRole。 这是我的 XML:
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="BLA"
version="2.5">
<listener>
<listener-class>com.example</listener-class>
</listener>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>report.pdf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/config/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
在这个xsl文件中,我控制只添加一次,但是添加了多次,我不知道如何只在role-name为AcctAdminRole时应用。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ee="http://java.sun.com/xml/ns/javaee"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="ee xs fn">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ee:web-app">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:if test="not(security-constraint)">
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>AcctAdminRole</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
感谢大家
如果您将 XSLT 应用到一个 XML,其中已经有一个 security-constraint
节点,您需要考虑命名空间。您的 XSLT 将 security-constraint
添加到命名空间“http://java.sun.com/xml/ns/javaee”,但 xsl:if
正在检查没有命名空间的 security-constraint
。
有两种方法可以解决这个问题。一种方法是向 xsl:if
test
<xsl:if test="not(ee:security-constraint)">
或者,当您使用 XSLT 2.0 时,您可以使用 xpath-default-namespace
来指示用于 xpath 表达式中任何无前缀元素的名称空间
<xsl:stylesheet version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ee="http://java.sun.com/xml/ns/javaee"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xpath-default-namespace="http://java.sun.com/xml/ns/javaee"
exclude-result-prefixes="ee xs fn">
您可能还想考虑在模板匹配中对 security-constraint
进行测试。
试试这个 XSLT
<xsl:stylesheet version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ee="http://java.sun.com/xml/ns/javaee"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xpath-default-namespace="http://java.sun.com/xml/ns/javaee"
exclude-result-prefixes="ee xs fn">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="web-app[not(security-constraint)]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>AcctAdminRole</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>