XSL: Eliminación anterior carpetas en fileref imageobject
Pregunta
Quiero eliminar precedentes './' y primera carpeta si no se llama '' capturas de pantalla para cualquier fileref que pertenece a imagedata ??p>
Así que desde
<section xmlns="http://docbook.org/ns/docbook" version="5">
<title>Screenshot</title>
<para xreflabel="New Type" xml:id="manageNewType">
<mediaobject>
<imageobject>
<imagedata fileref="./views/screenshots/manageType1.png" width="100%"/>
</imageobject>
<caption>
<para>New Mode</para>
</caption>
</mediaobject>
</para>
<para xreflabel="Edit Type" xml:id="manageEditType">
<mediaobject>
<imageobject>
<imagedata fileref="./screenshots/manageType2.png" width="100%"/>
</imageobject>
<caption>
<para>Edit Mode</para>
</caption>
</mediaobject>
</para>
</section>
Para: De pantalla
<para xreflabel="New Type" xml:id="manageNewType">
<mediaobject>
<imageobject>
<imagedata fileref="screenshots/manageType1.png" width="100%"/>
</imageobject>
<caption>
<para>New Mode</para>
</caption>
</mediaobject>
</para>
<para xreflabel="Edit Type" xml:id="manageEditType">
<mediaobject>
<imageobject>
<imagedata fileref="screenshots/manageType2.png" width="100%"/>
</imageobject>
<caption>
<para>Edit Mode</para>
</caption>
</mediaobject>
</para>
</section>
Aquí está mi hoja de estilo actual que no parece estar haciendo nada por alguna razón ...
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="imagedata/@fileref[starts-with(.,'./')
and not(starts-with(.,'./screenshots/'))
]">
<xsl:attribute name="fileref">
<xsl:value-of select="substring-after(substring-after(.,'./'), '/')"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="imagedata/@fileref[starts-with(.,'./screenshots/')]">
<xsl:attribute name="fileref">
<xsl:value-of select="substring-after(.,'./')"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Editar Añadido xmlns = "http://docbook.org/ns/docbook" version = "5" a la sección.
Solución
Esta transformación :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:d="http://docbook.org/ns/docbook">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"d:imagedata/@fileref
[contains(., '/screenshots/')
and
not(starts-with(., 'screenshots/'))
]">
<xsl:attribute name="fileref">
<xsl:value-of select=
"concat('screenshots/', substring-after(., '/screenshots/'))"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
cuando se realiza en el documento XML proporcionado
<section xmlns="http://docbook.org/ns/docbook" version="5">
<title>Screenshot</title>
<para xreflabel="New Type" xml:id="manageNewType">
<mediaobject>
<imageobject>
<imagedata fileref="./views/screenshots/manageType1.png" width="100%"/>
</imageobject>
<caption>
<para>New Mode</para>
</caption>
</mediaobject>
</para>
<para xreflabel="Edit Type" xml:id="manageEditType">
<mediaobject>
<imageobject>
<imagedata fileref="./screenshots/manageType2.png" width="100%"/>
</imageobject>
<caption>
<para>Edit Mode</para>
</caption>
</mediaobject>
</para>
</section>
produce el deseado, resultado correcto
<section xmlns="http://docbook.org/ns/docbook" version="5">
<title>Screenshot</title>
<para xreflabel="New Type" xml:id="manageNewType">
<mediaobject>
<imageobject>
<imagedata fileref="screenshots/manageType1.png" width="100%"/>
</imageobject>
<caption>
<para>New Mode</para>
</caption>
</mediaobject>
</para>
<para xreflabel="Edit Type" xml:id="manageEditType">
<mediaobject>
<imageobject>
<imagedata fileref="screenshots/manageType2.png" width="100%"/>
</imageobject>
<caption>
<para>Edit Mode</para>
</caption>
</mediaobject>
</para>
</section>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow