xslt - 在 XSLT 中使用 for-each 的最佳方式
问题描述
我将以下 XML 数据作为 XSLT 的输入:
<?xml version="1.0" encoding="UTF-8"?>
<Application>
<Data>
<Data1>
<name>Michale</name>
<age>65</age>
<Info>
<Alias name="M">
<Contactmail>abc@gmail.com</Contactmail>
<ContactPh>8988900009</ContactPh>
</Alias>
<Alias name="Q">
<Contactmail>abc@gmail.com</Contactmail>
<ContactPh>8988900009</ContactPh>
</Alias>
</Info>
</Data1>
<Data1>
<name>Albert</name>
<age>69</age>
<Info>
<Alias name="A">
<Contactmail>xyz@gmail.com</Contactmail>
<ContactPh>89889908709</ContactPh>
</Alias>
<Alias name="P">
<Contactmail>pqr@gmail.com</Contactmail>
<ContactPh>8988988779</ContactPh>
</Alias>
</Info>
</Data1>
</Data>
</Application>
我想传递Data1
别名与“M”匹配的块,即:
<Application>
<Data>
<Data1>
<name>Michale</name>
<age>65</age>
<Info>
<Alias name=M>
<Contactmail>abc@gmail.com</Contactmail>
<ContactPh>8988900009</ContactPh>
</Alias>
<Alias name=Q>
<Contactmail>abc@gmail.com</Contactmail>
<ContactPh>8988900009</ContactPh>
</Alias>
</Info>
</Data1>
</Data>
</Application>
我对如何在测试条件内访问循环(即别名)感到困惑?有没有更好的方法来做这个 xslt?
<xsl:for-each select="./*[local-name() = 'Application']/*[local-name() = 'Data']">
<xsl:if test="">
....
</xsl:if>
</xsl:for-each>
解决方案
以下模板将完成这项工作。解释在代码中。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" /> <!-- Removes unnecessary space between elements -->
<!-- identity template --> <!-- Copies all nodes not matched by other templates -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="Data1[Info/Alias/@name != 'M']" /> <!-- Ignores all Data1 elements which don't have an @name='M' attribute child -->
<xsl:template match="Data1[Info/Alias/@name = 'M']"> <!-- Matches all Data1 elements which have the desired child attribute -->
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
它的输出是:
<?xml version="1.0"?>
<Application>
<Data>
<Data1>
<name>Michale</name>
<age>65</age>
<Info>
<Alias name="M">
<Contactmail>abc@gmail.com</Contactmail>
<ContactPh>8988900009</ContactPh>
</Alias>
<Alias name="Q">
<Contactmail>abc@gmail.com</Contactmail>
<ContactPh>8988900009</ContactPh>
</Alias>
</Info>
</Data1>
</Data>
</Application>
推荐阅读
- stackdriver - Cloud Logging API 未显示 JSON 有效负载
- c - 将文件中的句点更改为感叹号,并将全文保存到新文件中
- java - 得到关于不兼容类型问题的 .equals(),我如何制作我的 ArrayList
并点兼容并将答案转换为布尔值 - swift - 核心数据:对多谓词被忽略
- java - 从用户那里获取输入——这段代码中有什么不好的味道?
- assembly - 为什么偏移运算符返回一个巨大的偏移量,而变量位于 .data 段的开头?
- node.js - Discord.js:TypeError:无法读取未定义的属性“get”
- php - 比较星期几和小时到现在
- html - 为什么我的幻灯片会向下滚动屏幕?
- javascript - 排序字符串/数字数组Javascript