如果条件匹配,我需要选择一个节点。我是XSLT的新手,并试图寻找答案,但找不到适合我的解决方案。 我想在AddressType ='Personal'时选择一个adres,如果没有AddressType = Personal,检查'Second',如果没有检查'Office'。 一个正常的If Else。 我试过和,如果XML文件中只存在一种类型的AddressType,这可能会起作用。在我的情况下,XML文件中可能有11个地址类型(按随机顺序),我只能传递一个。
这看起来像我的源XML:
<Person>
<address>
<street></street
<number></number>
<City></City>
<AddressType>Personal</AddressType>
</address>
<address>
<street></street
<number></number>
<City></City>
<AddressType>Second</AddressType>
</address>
<address>
<street></street
<number></number>
<City></City>
<AddressType>Office</AddressType>
</address>
</Person>
有什么建议吗?谢谢
答案 0 :(得分:6)
您需要使用<xsl:choose>
<?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" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/Person/address/AddressType='Personal'">
<!-- DO Stuff -->
</xsl:when>
<xsl:when test="/Person/address/AddressType='Second'">
<!-- DO Stuff -->
</xsl:when>
<xsl:when test="/Person/address/AddressType='Office'">
<!-- DO Stuff -->
</xsl:when>
<xsl:otherwise>
<!-- Do your else stuff -->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:3)
另一种选择,而不是在 xsl:choose 中嵌套所有内容,是使用模板匹配来获得所需的案例。试试这个XSLT作为例子
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Person[address/AddressType='Personal']" priority="3">
Match Personal
</xsl:template>
<xsl:template match="Person[address/AddressType='Second']" priority="2">
Match Second
</xsl:template>
<xsl:template match="Person[address/AddressType='Office']" priority="1">
Match Office
</xsl:template>
<xsl:template match="Person">
Match None
</xsl:template>
</xsl:stylesheet>
请注意,具有更多特定模式的模板优先于没有模式的模板(这就是为什么不会调用最后一个“Person”模板,除非任何其他模板不匹配。对于其他模板,如果所有三个模板都匹配,优先级属性将优先级更高。因此即使存在其他属性,也将始终选择“个人”。
(如果所有模板都没有优先级属性,则在这种情况下将选择最后一个匹配的模板。)
答案 2 :(得分:2)
您可以使用xsl:choose:
<xsl:choose>
<xsl:when test"some condition">
Statement...
</xsl:when>
<xsl:when test="some other condition">
Statement...
</xsl:when>
<xsl:otherwise>
Default...
</xsl:otherwise>
</xsl:choose>
答案 3 :(得分: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:param name="pAddressTypes" select="'PersonalSecondOffice'"/>
<xsl:template match="/*">
<xsl:apply-templates select="address">
<xsl:sort select=
"string-length(substring-before($pAddressTypes, AddressType))"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="address">
<xsl:if test="position() = 1">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(最初提供的地址随机重新调整地址):
<Person>
<address>
<street></street>
<number></number>
<City></City>
<AddressType>Office</AddressType>
</address>
<address>
<street></street>
<number></number>
<City></City>
<AddressType>Personal</AddressType>
</address>
<address>
<street></street>
<number></number>
<City></City>
<AddressType>Second</AddressType>
</address>
</Person>
选择并处理了需要的正确address
元素(在这种情况下只是输出):
<address>
<street/>
<number/>
<City/>
<AddressType>Personal</AddressType>
</address>