我想使用XSLT转换XML 这是我的示例XML
<EmployeList>
<EMpDetails>
<Name>Kiran</Name>
<ID>ID001</ID>
<city>Hyderabad</city>
<Country>India</Country>
</EMpDetails>
<EMpDetails>
<Name>Sunny</Name>
<ID>ID002</ID>
<city>Banglore</city>
<Country>INDIA</Country>
</EMpDetails>
<EMpDetails>
<Name>John</Name>
<ID>ID001</ID>
<city>TEXAS</city>
<Country>US</Country>
</EMpDetails>
<EMpDetails>
<Name>Raj</Name>
<ID>ID006</ID>
<city>Dallas</city>
<Country>US</Country>
</EMpDetails>
<EMpDetails>
<Name>Nag</Name>
<ID>ID007</ID>
<city>ITALY</city>
<Country>Rome</Country>
</EMpDetails>
</EmployeList>
使用XSLT所需的输出
<EmployeList>
<EMpDetails>
<Name>Kiran</Name>
<ID>ID001</ID>
<city>Hyderabad</city>
<Country>India</Country>
</EMpDetails>
<EMpDetails>
<Name>Sunny</Name>
<ID>ID002</ID>
<city>Banglore</city>
<Country>INDIA</Country>
</EMpDetails>
</EmployeList>
答案 0 :(得分:1)
假设问题要求只输出EMpDetails
Country
个孩子的字符串(不区分大小写)值为"India"
的{{1}}:
<强>予。这个XSLT 1.0转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"EMpDetails
[not(translate(Country,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'
)
='india'
)
]
"/>
</xsl:stylesheet>
应用于提供的XML文档:
<EmployeList>
<EMpDetails>
<Name>Kiran</Name>
<ID>ID001</ID>
<city>Hyderabad</city>
<Country>India</Country>
</EMpDetails>
<EMpDetails>
<Name>Sunny</Name>
<ID>ID002</ID>
<city>Banglore</city>
<Country>INDIA</Country>
</EMpDetails>
<EMpDetails>
<Name>John</Name>
<ID>ID001</ID>
<city>TEXAS</city>
<Country>US</Country>
</EMpDetails>
<EMpDetails>
<Name>Raj</Name>
<ID>ID006</ID>
<city>Dallas</city>
<Country>US</Country>
</EMpDetails>
<EMpDetails>
<Name>Nag</Name>
<ID>ID007</ID>
<city>ITALY</city>
<Country>Rome</Country>
</EMpDetails>
</EmployeList>
生成想要的正确结果:
<EmployeList>
<EMpDetails>
<Name>Kiran</Name>
<ID>ID001</ID>
<city>Hyderabad</city>
<Country>India</Country>
</EMpDetails>
<EMpDetails>
<Name>Sunny</Name>
<ID>ID002</ID>
<city>Banglore</city>
<Country>INDIA</Country>
</EMpDetails>
</EmployeList>
<强> II。这个XSLT 2.0转换:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"EMpDetails[not(upper-case(Country)='INDIA')]"/>
</xsl:stylesheet>
再次产生相同的,想要的和正确的结果。
解释:使用匹配所有不需要的EMpDetails
元素的模板覆盖标识规则。此模板具有空体,可有效防止将任何此类匹配元素复制到输出。
记住:使用和覆盖身份规则/模板是最基本,最强大的XSLT设计模式。
答案 1 :(得分:0)
这应该可以根据需要运行(假设您希望EMpDetails
所有Country
元素等于India
并且不区分大小写:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="EmployeList">
<EmployeList>
<xsl:copy-of select="EMpDetails[lower-case(Country) = 'india']"/>
</EmployeList>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
假设您的样本输入很简单,如图所示,您也可以使用:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/EmployeList">
<xsl:copy>
<xsl:copy-of select="EMpDetails[
Country[
.='India'
or .='INDIA']
]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>