templates - 在不同节点的级别上应用模板
问题描述
我尝试修改包含某个字符串的所有节点的 QName:并返回没有.
(例如我有<RandomName>
并且想要渲染<Name>
)
我有一个xsl:template
为第一级节点工作,但找不到如何将其应用于较低级别。
例如 XML 源
在这里我想删除所有的“默认”<?xml version="1.0" encoding="UTF-8"?>
<Object>
<DefaultID>XXXXXXX</DefaultID>
<DefaultType>Random</DefaultType>
<DefaultCustomer>
<DefaultID>XXXXXXX</DefaultID>
<DefaultName>John Doe</DefaultName>
<DefaultAddress>33th Whitecaslt Blvd.</DefaultAddress>
<DefaultNumber>+XX X XX XX XX XX</DefaultNumber>
</DefaultCustomer>
</Object>
预期结果
<?xml version="1.0" encoding="UTF-8"?>
<Object>
<ID>XXXXXXX</ID>
<Type>Random</Type>
<Customer>
<ID>XXXXXXX</ID>
<Name>John Doe</tName>
<Address>33th Whitecaslt Blvd.</Address>
<Number>+XX X XX XX XX XX</Number>
</Customer>
</Object>
我的 XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:if test="string-length(.)>0">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="//*[contains(name(), 'Default')]">
<xsl:element name="{substring-after(name(), 'Default')}">
<xsl:copy select=".">
<xsl:apply-templates match="//*[contains(name(), 'Default')]" />
</xsl:copy>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
是)我有的
<?xml version="1.0" encoding="UTF-8"?>
<Object>
<ID>XXXXXXX</ID>
<Type>Random</Type>
<Customer>
<DefaultID>XXXXXXX</DefaultID>
<DefaultName>John Doe</DefaultName>
<DefaultAddress>33th Whitecaslte Blvd.</DefaultAddress>
<DefaultNumber>+XX X XX XX XX XX</DefaultNumber>
</Customer>
</Object>
如您所见,模板与第二个节点的级别不匹配。
我想我的问题来自我的范围XPath
(<xsl:copy select='.'>
顺便说一句,这似乎没用)?或者也许在这里,<xsl:copy>
不是最好的选择(相同的结果 w/ <xsl:copy-of>
)?
解决方案
你多虑了。尝试简单:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(), 'Default')]">
<xsl:element name="{substring-after(name(), 'Default')}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- javascript - 静态站点生成器、mvc、laravel 或 plain 包括...使用什么
- java - 在android的另一个类中设置ViewHolder类的TextView
- sql - Qlikview 向上取整表达式
- python - 如何从受 __init__ 参数限制的对象实例中删除方法?
- elasticsearch - 发布 https://apm。
.com/intake/v2/rum/events net::ERR_BLOCKED_BY_CLIENT - html - 如何将 div 放在页面底部,但如果页面溢出则移动它 [已解决]
- makefile - Makefile:是否可以使用通过命令行传递的选项/标志来创建运行某些工具的目标
- amazon-web-services - AWS Datadog 集成问题
- sql-server - SQL 数据库镜像 - 创建新登录 - 主体/镜像
- r - 第二轴的ggplot图例