XSLT:检查属性是否存在
问题描述:
长时间潜伏者,第一次海报。XSLT:检查属性是否存在
我试图建立一个XSLT文件:如果一个节点存在
检查,如果它不为“0”
如果填写了节点不存在,检查,以确保每一个属性存在,以及是否有丢失属性填充它与“0”
我想我能做到这一点与<xsl:if/>
但我想,以避免这个因为大约有56个属性需要检查。
这里的主XML的样子:
<player name="KLINE, Zach" shortname="KLINE, Zach" checkname="KLINE,ZACH" uni="1Q" class="SR" gp="1" code="1Q">
<rush att="1" yds="11" gain="11" loss="0" td="0" long="11"></rush>
<pass comp="7" att="11" int="1" yds="110" td="0" long="32" sacks="0" sackyds="0"></pass>
</player>
<player name="JORDAN, Jamire" shortname="JORDAN, Jamire" checkname="JORDAN,JAMIRE" uni="1" class="SO" gp="1" code="1">
<rush att="1" yds="1" gain="1" loss="0" td="0" long="1"></rush>
<rcv no="5" yds="52" td="0" long="16"></rcv>
</player>
输出应该是这样的:
<player name="KLINE, Zach" shortname="KLINE, Zach" checkname="KLINE,ZACH" uni="1Q" class="SR" gp="1" code="1Q">
<rush att="1" yds="11" gain="11" loss="0" td="0" long="11"></rush>
<pass comp="7" att="11" int="1" yds="110" td="0" long="32" sacks="0" sackyds="0"></pass>
<rcv no="0" yds="0" td="0" long="0"></rcv>
</player>
<player name="JORDAN, Jamire" shortname="JORDAN, Jamire" checkname="JORDAN,JAMIRE" uni="1" class="SO" gp="1" code="1">
<rush att="1" yds="1" gain="1" loss="0" td="0" long="1"></rush>
<pass comp="0" att="0" int="0" yds="0" td="0" long="0" sacks="0" sackyds="0"></pass>
<rcv no="5" yds="52" td="0" long="16"></rcv>
</player>
答
这似乎是一个理想的情况下使用xsl:attribute-set
。考虑下面的简单的例子:
XML
<root>
<player name="KLINE, Zach">
<rush att="1" yds="11" gain="11"/>
</player>
<player name="JORDAN, Jamire">
<rcv yds="52" long="16"/>
</player>
<player name="SMITH, Adam"/>
</root>
XSLT 1.0
<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="*"/>
<xsl:attribute-set name="rush">
<xsl:attribute name="att">0</xsl:attribute>
<xsl:attribute name="yds">0</xsl:attribute>
<xsl:attribute name="gain">0</xsl:attribute>
<xsl:attribute name="loss">0</xsl:attribute>
<xsl:attribute name="td">0</xsl:attribute>
<xsl:attribute name="long">0</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="rcv">
<xsl:attribute name="no">0</xsl:attribute>
<xsl:attribute name="yds">0</xsl:attribute>
<xsl:attribute name="td">0</xsl:attribute>
<xsl:attribute name="long">0</xsl:attribute>
</xsl:attribute-set>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="player">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<rush xsl:use-attribute-sets="rush">
<xsl:apply-templates select="rush/@*"/>
</rush>
<rcv xsl:use-attribute-sets="rcv">
<xsl:apply-templates select="rcv/@*"/>
</rcv>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<root>
<player name="KLINE, Zach">
<rush att="1" yds="11" gain="11" loss="0" td="0" long="0"/>
<rcv no="0" yds="0" td="0" long="0"/>
</player>
<player name="JORDAN, Jamire">
<rush att="0" yds="0" gain="0" loss="0" td="0" long="0"/>
<rcv no="0" yds="52" td="0" long="16"/>
</player>
<player name="SMITH, Adam">
<rush att="0" yds="0" gain="0" loss="0" td="0" long="0"/>
<rcv no="0" yds="0" td="0" long="0"/>
</player>
</root>
+0
非常感谢你 - 这是诀窍! – Rob
请告诉我们的预期转换给定示例的输出。 –
完成!谢谢 – Rob