XSLT:检查属性是否存在

时间:2017-07-31 18:14:00

标签: xml xslt xpath

我正在尝试构建一个XSLT文件:

  1. 检查某个节点是否存在,以及是否使用" 0"

  2. 填写该节点
  3. 如果节点确实存在,请检查以确保每个属性都存在,如果缺少属性,则用" 0"

  4. 我认为我可以使用<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>  
    

1 个答案:

答案 0 :(得分:1)

这似乎是使用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>