<xsl:apply templates =“”>如何应用多个模板/翻译

时间:2015-09-07 23:46:18

标签: xml xslt

卡住了,请咨询。我不担心XSLT专家。

我有这个示例XML:

"/a[1]/b[@key='z']"

我需要输出<p></p>的内容并将所有<br/>和所有&#xa; - 块转换为UNIX换行符&#10; / /。同时确保输出代码没有|\&0x9;/|\(水平制表符)类型的字符。

所有- - 字符应由连字符<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <xsl:variable name="foo" select="/a[1]/b[@key='z']" /> <xsl:apply-templates select="$foo" /> </xsl:template> <xsl:template match="/a[1]/b[@key='z']"> <xsl:value-of select="translate(.,'/\|&#x9;', '---')"/> <xsl:apply-templates /> </xsl:template> <xsl:template match="br"> <xsl:text>&#xa;</xsl:text> </xsl:template> </xsl:stylesheet> 替换,并且所有水平制表符应完全删除。

这是我目前的XSL:

<?xml version="1.0" encoding="UTF-8"?>This contains HTML Code.Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. ------Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.--- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
This contains HTML Code.

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 

At vero eos et accusam et justo duo dolores et ea rebum. 
///
///Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.///
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
At vero eos et accusam et justo duo dolores et ea rebum. 
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

我得到的输出确实有两个结果,一个带有替换,另一个带有换行符:

clip(text);

请问,如何插入换行符替换不需要的字符?

2 个答案:

答案 0 :(得分:1)

您可以通过处理文本节点并明确匹配它们来解决此问题。由于您只需翻译一次文本节点,因此这是满足您需求的有效解决方案。

使用下面的代码,我还使用b简化了匹配模板,因为从根节点开始,您已经进行了选择,并且没有其他地方应用了不正确的b节点。

我添加了匹配p,需要处理其子代(请参阅代码)。您可能希望将其拆分,因为您可能需要使用p代替换行符。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0">

    <xsl:template match="/">
        <xsl:variable name="foo" select="/a[1]/b[@key='z']" />
        <xsl:apply-templates select="$foo" /> 
    </xsl:template>

    <!-- this currently does nothing and can be removed, 
         unless in your code something more is done here -->
    <xsl:template match="b">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="br | p">
        <xsl:text>&#xa;</xsl:text>
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="text()">
        <xsl:value-of select="translate(.,'/\|&#x9;', '---')"/>
    </xsl:template>

</xsl:stylesheet>

这给出了:

This contains HTML Code.

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 

At vero eos et accusam et justo duo dolores et ea rebum. 
---
---Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.---
 Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
At vero eos et accusam et justo duo dolores et ea rebum. 
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

答案 1 :(得分:1)

以这种方式试试吗?

XSLT 1.0

<?php
include_once 'includes/db_connect.php';
include_once 'includes/functions.php';

sec_session_start();

if(!isset($_SESSION['username'])) {
   header("Location: index.php");
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html;charset=ISO-8859-1" />
<link rel="stylesheet" href="datepicker.css" type="text/css" />
<link rel="stylesheet" href="demo.css" type="text/css" />
<link rel="stylesheet" href="style.css" type="text/css" />
<script type="text/javascript" src="datepicker.js"></script>
<script type="text/javascript" src="ValidarDatos.js"></script>


<title>Consulta niño Coprodeli Intranet</title>
</head>
<body>


<div id="content">
    <div id="logo"> <a href="#"> <img src="images/logo.jpg" /></a> </div>
    <ul id="menu">
            <li><a href="home.php">Home</a></li>
            <li><a href="ConsultaNino.php" class="seleccionado">Niños</a></li>
            <li><a href="ConsultaPadrino.php">Padrinos</a></li>
            <li><a href="ConsultaCentro.php">Centros</a></li>
            <li><a href="Informes.php">Informes</a></li>            
            <li><a href="ConsultaUsuario.php">Usuarios</a></li>         
            <li><a href="Security/aut_logout.php">Salir</a></li>
    </ul>
    <div id="intro2">
        <h1>Intranet Coprodeli</h1>
        <p>Apadrinamiento y Programa<br />
            de Niños en Alto Riesgo</p>
        <div id="login">
            </div>
    </div>
    <div id="right2">
    <h4 class="migas">Estás en: <a href="home.php">Inicio</a> | Consulta de niños</h4>
    <br />


<?php
$output = NULL;
if(isset($_POST['submit'])){
    // Connect to the database
    $mysqli = NEW MySQLi("localhost","root","","coprodeli");
    $nino_id = $mysqli->real_escape_string( $_POST['nino_id']);
    $nombre = $mysqli->real_escape_string( $_POST['nombre']);
    $apellidos = $mysqli->real_escape_string( $_POST['apellidos']);
    $sexo = $mysqli->real_escape_string( $_POST['sexo']);
    $estado = $mysqli->real_escape_string( $_POST['estado']);
    $fecha_de_nacimiento_desde = $mysqli->real_escape_string( $_POST['fecha_de_nacimiento_desde']);
    $fecha_de_nacimiento_hasta = $mysqli->real_escape_string( $_POST['fecha_de_nacimiento_hasta']);
    $tipo_de_centro = $mysqli->real_escape_string( $_POST['tipo_de_centro']);
    $nombre_del_centro = $mysqli->real_escape_string( $_POST['nombre_del_centro']);
    $region_del_centro = $mysqli->real_escape_string( $_POST['region_del_centro']);
    $nivel_de_estudio = $mysqli->real_escape_string( $_POST['nivel_de_estudio']);
    $entrada_desde = $mysqli->real_escape_string( $_POST['entrada_desde']);
    $entrada_hasta = $mysqli->real_escape_string( $_POST['entrada_hasta']);
    $egreso_desde = $mysqli->real_escape_string( $_POST['egreso_desde']);
    $egreso_hasta = $mysqli->real_escape_string( $_POST['egreso_hasta']);
    //Query the database
    $resultSet = $mysqli->query("SELECT nino_id, nombre, apellidos, sexo, estado, fecha_de_nacimiento_desde, fecha_de_nacimiento_hasta,
    tipo_de_centro, nombre_del_centro, region_del_centro, nivel_de_estudio, entrada_desde, entrada_hasta, egreso_desde, egreso_hasta FROM nino
    WHERE nino_id = '$nino_id' AND nombre = '$nombre' AND apellidos = '$apellidos' AND sexo = '$sexo' AND estado = '$estado' AND fecha_de_nacimiento_desde = '$fecha_de_nacimiento_desde'
    AND fecha_de_nacimiento_hasta = '$fecha_de_nacimiento_hasta' AND tipo_de_centro = '$tipo_de_centro' AND nombre_del_centro = '$nombre_del_centro' AND
    region_del_centro = '$region_del_centro' AND nivel_de_estudio = '$nivel_de_estudio' AND entrada_desde = '$entrada_desde' AND entrada_hasta = '$entrada_hasta'
  AND egreso_desde = '$egreso_desde' AND egreso_hasta = '$egreso_hasta';" ) ;
    // Edited on 9/7/2015 12:39PM by Anthony Sawah. I changed it from  "  if($resultSet['num_rows'] > 0) {   "  to " if($resultSet->num_rows > 0) {"
    if($resultSet->num_rows > 0) {
        while($rows = $resultSet->fetch_assoc())
        {
            $nino_id = $rows['nino_id'];
            $nombre = $rows['nombre'];
            $apellidos = $rows['apellidos'];
            $sexo = $rows['sexo'];
            $estado = $rows['estado'];
            $fecha_de_nacimiento_desde = $rows['fecha_de_nacimiento_desde'];
            $fecha_de_nacimiento_hasta = $rows['fecha_de_nacimiento_hasta'];
            $tipo_de_centro = $rows['tipo_de_centro'];
            $nombre_del_centro = $rows['nombre_del_centro'];
            $region_del_centro = $rows['region_del_centro'];
            $nivel_de_estudio = $rows['nivel_de_estudio'];
            $entrada_desde = $rows['entrada_desde'];
            $entrada_hasta = $rows['entrada_hasta'];
            $egreso_desde = $rows['egreso_desde'];
            $egreso_hasta = $rows['egreso_hasta'];
            $output .= "Estado: $estado     ID niño: $nino_id   Apellidos: $apellidos     Nombre: $nombre   Fecha Ingreso: $egreso_desde  Fecha Egreso: $egreso_hasta  ";
        }
    }else{
        $output = "No results";
    }
}
?>
<fieldset class="required">
        <legend>Consulta de niños:</legend>
    <form method ="POST">
        ID niño: <input type="text" name="nino_id" />
        <br> </br>
        Nombre: <input type="text" name="nombre" />
        <br> </br>
        Apellidos: <input type="text" name="apellidos" />  <br> </br>
        Sexo: <input type="text" name="sexo" />  <br> </br>
        Estado: <input type="text" name="estado" />  <br> </br>
        Fecha de
        nacimiento desde
        (DD-MM-YYYY): <input type="text" name="fecha_de_nacimiento_desde" />  <br> </br>
        Fecha de
        nacimiento hasta
        (DD-MM-YYYY): <input type="text" name="fecha_de_nacimiento_hasta" />  <br> </br>
        Tipo de centro: <input type="text" name="tipo_de_centro" />  <br> </br>
        Nombre Del Centro: <input type="text" name="nombre_del_centro" />  <br> </br>
        Región del Centro: <input type="text" name="region_del_centro" />  <br> </br>
        Nivel de estudio: <input type="text" name="nivel_de_estudio" />  <br> </br>
        Entrada desde
        (DD-MM-YYYY): <input type="text" name="entrada_desde" />  <br> </br>
        Entrada hasta
        (DD-MM-YYYY): <input type="text" name="entrada_hasta" />  <br> </br>
        Egreso desde
        (DD-MM-YYYY): <input type="text" name="egreso_desde" />  <br> </br>
        Egreso hasta
        (DD-MM-YYYY): <input type="text" name="egreso_hasta" />  <br> </br>


        <input type="submit" name="submit" value="Search" />
    </form>
    </fieldset>



        <fieldset id="" class="required">
        <legend>Resultado de la b&uacute;squeda:</legend>
        <form id="form7" name="ResultadoBusqueda" action="ConsultarDetalleNino.php" enctype="multipart/form-data" method="post" >
        <table>

            <tr>
            <td class="especial" width="11"></td>
            <td colspan="6" class="especial"> </td>
            </tr>
                <tr>
                    <th></th>
                    <th width="15"></th>
                    <th width="88">Estado</th>
                    <th width="104">ID ninos </th>
                    <th width="234">Apellidos</th>
                    <th width="81">Nombre</th>
                    <th width="128">Fecha Ingreso</th>
                    <th width="106">Fecha Egreso</th>
                </tr>
            </table>


            <?php echo $output;?>
        <div class="actions">
          <input name="ConsultarDetalleNino" type="submit" class="primaryAction" id="submit-" value="Consultar Detalle">



            <input name="Cancelar" type="submit" class="primaryAction" id="submit-" value="Cancelar">
        </div>

        </form>
        <form id="ListadoNinos" name="ListadoNinos" action="InformeNinos.php"  method="post" target="_blank"></form>
        </fieldset>

    <div style="clear: both"></div>
</div>
<div id="footer">
    <div id="col1">
        <p><a href="#"> </a><a href="#"></a><br />
            &copy;  <a href="#"></a></p>
    </div>
    <div id="col2">
        <p>Info:<strong><a href=""></a></strong><br />
            Info2: <strong>completar</strong></p>
    </div>
    <div id="col3">
        <p>
    </div>

</div>
</div>
</body>
</html>

结果应用于您的示例时将是:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/a">
    <xsl:apply-templates select="b[@key='z']"/>
</xsl:template>

<xsl:template match="br">
    <xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="text()">
    <xsl:value-of select="translate(., '/|\&#x9;', '----')"/>
</xsl:template>

</xsl:stylesheet>

注意:XML文档只能有一个根元素,因此This contains HTML Code. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. --- ---Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.--- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 中的谓词是多余的。 &#39; $ foo&#39;只使用一次的变量。