Bien le bonjour la communauté
.
Je vous expose mon souci. Un nouveau challenge à votre sagacité...
Je travaille depuis quelques temps avec les principes XLST pour modifier des xmls qui sont la source de notre "Document Management System".
Notre business, par charte graphique, ne veut pas de bullet mais un tiret pour l'indentation (puce).
Je ne peux agir que sur le contenu des valeurs des noeuds (pas dans la config du tinymce ou du DMS).
Mon but étant de remplacer chaque occurrence bullet "•" par un tiret (hyphen) tout en gardant la structure dans son noeud général "FreeText" (structure non modifiable).
A ce point, les remplacements s'effectuent mais il perd tous les noeuds enfants...
J'ai donc ceci comme xml, en entrée :
Citation :
<?xml version="1.0" encoding="UTF-8"?>
<form>
<Document>
<Header>
<Message>
<MessageOriginalName>QUICK_DOCUMENTS</MessageOriginalName>
</Message>
</Header>
</Document>
<Eform>
<Selection_Heading1>FourthActor_1</Selection_Heading1>
<Selection_Heading2>Beneficiary_2</Selection_Heading2>
<Selection_Heading3>Beneficiary_1</Selection_Heading3>
<FreeText mediatype="text/xslfo">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:block>
<fo:list-block margin-bottom="12pt" margin-top="12pt">
<fo:list-item>
<fo:list-item-label end-indent="label-end()">
<fo:block>•</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>Ligne 1</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item>
<fo:list-item-label end-indent="label-end()">
<fo:block>•</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>Ligne 2</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>
</fo:block>
</fo:block>
</FreeText>
<SelectedAll>true</SelectedAll>
</Eform>
</form>
|
Et je voudrais par transformation xsl, ceci en sortie :
Citation :
<?xml version="1.0" encoding="UTF-8"?>
<form>
<Document>
<Header>
<Message>
<MessageOriginalName>QUICK_DOCUMENTS</MessageOriginalName>
</Message>
</Header>
</Document>
<Eform>
<Selection_Heading1>FourthActor_1</Selection_Heading1>
<Selection_Heading2>Beneficiary_2</Selection_Heading2>
<Selection_Heading3>Beneficiary_1</Selection_Heading3>
<FreeText mediatype="text/xslfo">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:block>
<fo:list-block margin-bottom="12pt" margin-top="12pt">
<fo:list-item>
<fo:list-item-label end-indent="label-end()">
<fo:block>-</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>Ligne 1</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item>
<fo:list-item-label end-indent="label-end()">
<fo:block>-</fo:block>
</fo:list-item-label>
<fo:list-item-body start-indent="body-start()">
<fo:block>Ligne 2</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>
</fo:block>
</fo:block>
</FreeText>
<SelectedAll>true</SelectedAll>
</Eform>
</form>
|
Grâce à mon dernier xsl ci-dessous, les remplacements s'effectuent mais il perd tous les noeuds enfants
Citation :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:param name="replace" select="'•'"/>
<xsl:param name="by" select="'-'"/>
<xsl:template match="*">
<xsl:if test="/form/Document/Header/Message/MessageOriginalName[contains(., 'QUICK_DOCUMENTS')]">
<xsl:choose>
<xsl:when test="name()='FreeText'">
<xsl:variable name="FT"><xsl:value-of select="string(/form/Eform/FreeText)"/></xsl:variable>
<FreeText mediatype="text/xslfo"><xsl:value-of select="replace($FT, $replace, $by)"/></FreeText>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:if test="not(/form/Document/Header/Message/MessageOriginalName[contains(., 'QUICK_DOCUMENTS')])">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
|
J'obtiens ce mauvais xml généré :
Citation :
<?xml version="1.0" encoding="UTF-8"?>
<form>
<Document>
<Header>
<Message>
<MessageOriginalName>QUICK_DOCUMENTS</MessageOriginalName>
</Message>
</Header>
</Document>
<Eform>
<Selection_Heading1>FourthActor_1</Selection_Heading1>
<Selection_Heading2>Beneficiary_2</Selection_Heading2>
<Selection_Heading3>Beneficiary_1</Selection_Heading3>
<FreeText mediatype="text/xslfo">-Ligne 1-Ligne 2</FreeText>
<SelectedAll>true</SelectedAll>
</Eform>
</form>
|
Si une âme charitable voudrait bien m'aider, je le remercie déjà d'avance... 
Message édité par smilodongor le 17-10-2022 à 09:52:02