XSL si la condition else
J'ai une exigence où j'aimerais avoir si d'autre instruction pour vérifier si un nœud possède les attributs d'ou il vient de chaîne.
Par exemple: 1 du nœud a 0 File(s) found
et l'autre a attribs comme <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='64' filename='AFP_p.tgp' />
Ci-dessous est un échantillon de deux nœuds
<product>
<autoIncludeUser>0 File(s) found</autoIncludeUser>
<autoIncludeSystem>
<autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='64' filename='AFP_p.tgp' />
<autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='3,879' filename='AnalystsExpressionMacros.tgp' />
<autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='475' filename='base64Converter.tgp' />
<autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='<DIR>' filename='codePages' />
</autoIncludeSystem>
<autoIncludeStudio>0 File(s) found</autoIncludeStudio>
<externalLibrarySystem>
<externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='196,608' filename='AFPtoXML_DP.dll' />
<externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='13,259' filename='ASN1toXSDRunner.jar' />
<externalLibrarySystem>
</product>
Comment puis-je déterminer si un nœud a juste les cordes ou les attribs et, d'après ce que je peux obtenir les valeurs String
ou attrib values
respectivement.
- Bonne question, +1. Voir ma réponse pour un seul XPath 1.0 expression qui met en œuvre le voulait
if then else
logique. 🙂 J'ai fourni une transformation XSLT-vérification et une explication détaillée. - Ajout également d'une XPath 2.0 solution.
- Après avoir pris un coup d'oeil à votre XML, vous devez utiliser
xs:dateTime
etxs:long
au lieu de la merde, American-style de types.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez remplacer l'ensemble de votre
xsl:choose
avec l'instruction:puis ajouter deux modèles:
<h3>System</h3><xsl:apply-templates select="autoIncludeSystem"/>
directement?Nous pouvons réaliser si l'autre par l'utilisation de code ci-dessous
Voici donc ce que j'ai fait
Ma Sortie
I. Xpath 1.0 solution - utiliser cette expression XPath:
Ici est un XSLT de vérification basée sur les:
lorsque cette transformation est appliquée sur le document XML fourni par le (légèrement modifiée pour être bien formé):
le voulait, résultat correct est produit:
Explication Nous utilisons ces faits:
Pour toute chaîne
$s
,substring($s, Infinity)
est la chaîne vide.1 div 0
estInfinity
Par définition
number(true())
est1
etnumber(false())
est de 0.II. XPath 2.0 solution:
C'est beaucoup plus facile dans XPath 2.0, parce que la langue est la norme de
if/then/else
opérateur.Utilisation:
XSLT 2.0 vérification:
lorsque cette transformation est appliquée sur le même document XML (ci-dessus), de nouveau le voulait, résultat correct est produit:
XPath
//*[not(@*)]
va sélectionner tous les éléments, qui n'ont pas d'attributs.Vous pouvez le faire assez facilement à l'aide de
xsl:choose
- mais, très souvent, dans XSLT, la meilleure façon de faire un traitement conditionnel est d'écrire des différentes règles de modèle pour gérer les différentes conditions. Afin d'écrire un modèle de règle avecmatch="*[@*]"
pour faire correspondre les éléments qui ont des attributs, et un autre avecmatch="*[text()]"
pour faire correspondre les éléments qui ont un contenu textuel.