1

I'm trying to build an XSLT file to:

  1. check if a node exists, and if it doesn't to fill it in with a "0"

  2. if the node does exists, check to make sure each attribute is present, and if there's a missing attribute fill it in with a "0"

I figured I can do this with a <xsl:if/> but I'd like to avoid this because there's around 56 attributes I'd have to check for.

Here's what the main XML looks like:

<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> 

The output should look like this:

<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> 
0

1 Answer 1

1

This seems like an ideal case to use xsl:attribute-set. Consider the following simplified example:

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> 

Result

<?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> 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.