首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >迭代并将XSLT标识转换应用到文档目录中?

迭代并将XSLT标识转换应用到文档目录中?
EN

Stack Overflow用户
提问于 2016-01-15 04:15:33
回答 3查看 426关注 0票数 1

我有一个包含HTML文件的文件夹,其外观大致如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="d10e3019" class="content">
   <h1>header</h1>
   <div class="adv">
      <div class="warn">
         <img width="60px" height="20px" src="img/warn.png" alt="WARNING"></img>
         <p class="cause">gfgfg!</p>
         <p>⇒  Thgfh</p>
         <p class="step"><span class="emphasis">hgfh
         </p>
      </div>
   </div>
</div>

它们都有<div id="someId" class="content">作为根元素,然后只是各种HTML。

我需要更改每个文档的src标记中的所有img属性,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<img width="60px" height="20px" src="http://server.com/{$nameOfTheCurtentFolder}/img/warn.png" alt="WARNING"></img>

并使用新的子元素将新输出包装在另一个div中。文档的其余部分需要完全相同。

我尝试了这个样式表,但是使用这个样式表,只有文本节点被写入输出文档中(同时生成新的div元素工作):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:fn='http://www.w3.org/2005/xpath-functions' exclude-result-prefixes='xsl xs fn' xmlns:h="http://java.sun.com/jsf/html">
    <xsl:output method="xml" encoding="utf-8"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="files" select="collection('./output?select=*.html')"/>

    <xsl:template match="/">
        <xsl:for-each select="$files">
            <xsl:variable name="fileName" select="tokenize(base-uri(), '/')[last()]"/>
            <xsl:result-document method="xhtml" href="new/{$fileName}">
                <div>
                    <h:selectBooleanCheckbox value="pubs"/>
                    <xsl:copy>
                        <xsl:apply-templates select="@* | node()"/>
                    </xsl:copy>
                </div>
            </xsl:result-document>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="@src">
        <xsl:variable name="nameOfTheCurtentFolder" select="tokenize(base-uri(), '/')[last()-2]"/>
        <xsl:text>http://server.com/</xsl:text>
        <xsl:value-of select="$nameOfTheCurtentFolder"/>
        <xsl:text>/output/</xsl:text>
        <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>

输出如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
              <div>
                 <h:selectBooleanCheckbox value="pubs"/>
                  headergfgfg!⇒  Thgfhhgfh
              </div>

这是我先前问题的后续,Change attribute value without creating new output document?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-15 04:55:08

您的样式表似乎缺少了标识转换模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

此外,为了更改属性值,您需要首先重新创建它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<xsl:template match="@src">
    <xsl:attribute name="src">
        <xsl:variable name="nameOfTheCurtentFolder" select="tokenize(base-uri(), '/')[last()-2]"/>
        <xsl:text>http://server.com/</xsl:text>
        <xsl:value-of select="$nameOfTheCurtentFolder"/>
        <xsl:text>/output/</xsl:text>
        <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>

最后,要处理的HTML文档也必须是格式良好的XML;提供的示例不是。

票数 2
EN

Stack Overflow用户

发布于 2016-01-15 05:02:05

它也开始工作了,只晚了5分钟(与michael.hor257k相比):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:fn='http://www.w3.org/2005/xpath-functions' exclude-result-prefixes='xsl xs fn' xmlns:h="http://java.sun.com/jsf/html">
    <xsl:output method="xml" encoding="utf-8"/>
    <xsl:strip-space elements="*"/>
    <xsl:param name="files" select="collection('./output/*.xml')"/>
    <xsl:template match="/">
        <xsl:for-each select="$files">
            <xsl:variable name="fileName" select="tokenize(base-uri(), '/')[last()]"/>
            <xsl:result-document method="xhtml" href="new/{$fileName}">
                <div>
                    <h:selectBooleanCheckbox value="pubs"/>
                    <xsl:copy>
                        <xsl:apply-templates/>
                    </xsl:copy>
                </div>
            </xsl:result-document>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@src">
        <xsl:attribute name="src">
            <xsl:variable name="nameOfTheCurtentFolder" select="tokenize(base-uri(), '/')[last()-2]"/>
            <xsl:text>http://server.com/</xsl:text>
            <xsl:value-of select="$nameOfTheCurtentFolder"/>
            <xsl:text>/output/</xsl:text>
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>
票数 1
EN

Stack Overflow用户

发布于 2016-01-15 05:39:05

通解

XSLT没有在文件目录中迭代的标准方法。您应该通过外部控制应用XSLT来实现这种效果。collection()函数的Saxon扩展,但是,它可以这样做.

迭代输入文档并应用标识变换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
The following XSLT will apply an adjusted identity transformation to all `$inSubdirName` HTML files and place the results in `$outSubdirName`:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:output omit-xml-declaration="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:param name="inSubdirName" select="'in'"/>
  <xsl:param name="outSubdirName" select="'out'"/>

  <!-- Driver for each file in inSubdirName -->
  <xsl:template match="/">
    <xsl:for-each select="collection(concat($inSubdirName, '/?select=*.html'))">
      <xsl:variable name="inFileName" select="base-uri()"/>
      <xsl:variable name="outFileName"
                    select="concat($outSubdirName, '/',
                            tokenize(base-uri(), '/')[last()])"/>
      <xsl:message select="concat('Transforming from ',
                           $inFileName, ' to ', $outFileName)"/>
      <xsl:result-document method="xhtml" href="{$outFileName}">
        <xsl:apply-templates select="@*|node()"/>
      </xsl:result-document>
    </xsl:for-each>
  </xsl:template>

  <!-- Identity transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Identity transform overrides -->
  <xsl:template match="/div">
    <div xmlns:h="http://java.sun.com/jsf/html">
      <h:selectBooleanCheckbox value="pubs"/>
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </div>
  </xsl:template>

  <xsl:template match="@src">
    <xsl:attribute name="src">
      <xsl:variable name="nameOfTheCurrentFolder"
                    select="tokenize(base-uri(), '/')[last()-2]"/>
      <xsl:text>http://server.com/</xsl:text>
      <xsl:value-of select="$nameOfTheCurrentFolder"/>
      <xsl:text>/output/</xsl:text>
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

应用于输入HTML文件时,如您所提供的,更正为格式良好:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="d10e3019" class="content">
   <h1>header 1</h1>
   <div class="adv">
      <div class="warn">
         <img width="60px" height="20px" src="img/warn.png" alt="WARNING"></img>
         <p class="cause">gfgfg!</p>
         <p>⇒  Thgfh</p>
         <p class="step"><span class="emphasis">hgfh</span>
         </p>
      </div>
   </div>
</div>

@src将使用新的属性以及新的 div h:selectBooleanCheckbox 子元素来转换它们。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div xmlns:h="http://java.sun.com/jsf/html">
   <h:selectBooleanCheckbox value="pubs"></h:selectBooleanCheckbox>
   <div id="d10e3019" class="content">
      <h1>header 1</h1>
      <div class="adv">
         <div class="warn">
            <img width="60px" height="20px" src="http://server.com/xslt/output/img/warn.png" alt="WARNING"></img>
            <p class="cause">gfgfg!</p>
            <p>⇒  Thgfh</p>
            <p class="step"><span class="emphasis">hgfh</span>
            </p>
         </div>
      </div>
   </div>
</div>

请求,并为h命名空间前缀添加一个声明,以确保输出格式良好。

还请注意对原始XSLT的以下改进:

  • 输入和输出目录是参数化的。
  • 执行迭代的驱动程序XSLT与负责应用更改的标识转换XSLT模板完全隔离。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34810899

复制
相关文章
Jersey框架一:Jersey RESTful WebService框架简介[通俗易懂]
开发RESTful WebService意味着支持在多种媒体类型以及抽象底层的客户端-服务器通信细节,如果没有一个好的工具包可用,这将是一个困难的任务
全栈程序员站长
2022/09/29
1.7K0
Jersey快速入门案例
Eclipse Jersey 是一个 REST 框架,提供了 JAX-RS (JSR-370) 的实现。
青山师
2023/05/05
5930
java jersey使用总结_Java Jersey2使用总结
在短信平台一期工作中,为便于移动平台的开发,使用了Java Jersey框架开发RESTFul风格的Web Service接口。在使用的过程中发现了一些问题并积累了一些项目经验,做了一下总结,便于个人成长,同时也希望对有需要的同仁有好的借鉴和帮助。
全栈程序员站长
2022/09/14
1.3K0
干货分享:基于JBoss的七个Java应用场景
声明 本文主要是针对EAP7的相关实验的记录,本文仅供参考。仅代表作者的个人观点。 在实验过程中,笔者得到了舒服力和Kylin的大力帮助,很多代码的review是和舒力一起完成的。 本文包含七个实验:RESTEasy框架构建应用、消息队列实验、web的安全试验、EAP的单机模式部署应用、EAP的高可用模式、通过web console管理EAP、CDI的实战。 前言:什么是EAP? 红帽JBoss企业应用平台 7 (JBoss EAP) 是一款市场领先的开源平台,适用于在任意环境中部署现代化 Java 应用
魏新宇
2018/03/22
2.3K0
干货分享:基于JBoss的七个Java应用场景
C++模板取函数参数类型和返回值类型的方法
static_assert(is_same_v<decltype(f), int(int, short, float)>);
用户7886150
2021/02/03
4.2K0
搭建单体SpringBoot项目 集成Swagger接口文档
浏览器访问 http://ip:port/swagger-ui/index.html
郭顺发
2023/07/07
4090
SpringBoot2集成Swagger
SpringBoot引入Swagger的maven库之前,需要先引入springboot-web的maven,否则没有效果。
郭顺发
2023/07/17
5520
SpringBoot2集成Swagger
Resteasy ,从学会使用到了解原理
1、背景知识 1.1)了解Rest是什么? 1.2)了解JAX-RS是什么? 1.3)RestEasy简介 2、手把手教你使用Resteasy 3、揭秘Resteasy的实现原理 4、总结 一、Rest简介及Resteasy产生背景 1.1)了解Rest是什么: REST是英文RepresentationalState Transfer 的缩写,有中文翻译为“具象状态传输”。REST 这个术语是由 RoyFielding 在他的博士论文《Architectural Sty
yuanyi928
2018/04/02
2.6K0
Resteasy ,从学会使用到了解原理
java中给方法的参数设置默认值,java设置可选参数
今天在调整一个定时任务时需要将固定写死的查询日期通过外部传参来控制,如果没有传值给个默认值,于是了解了下java函数的参数默认值
高久峰
2023/06/29
7.7K0
java 利用JAX-RS快速开发RESTful 服务
JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 。从
菩提树下的杨过
2018/01/24
1.4K0
java 利用JAX-RS快速开发RESTful 服务
java.library.path_java的path的设置路径
添加Handler: me.add(new ContextPathHandler(“ctx”)),然后在页面中就可以 ${ctx} 来用
全栈程序员站长
2022/09/29
6370
没有任何类型 Windows 的外层实例可访问---Java内部类与外类型
没有任何类型 TestThread 的外层实例可访问。必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配。
似水的流年
2019/12/08
1.1K0
如何借助 Quarkus 和 MicroProfile 实现微服务
作者 | Alex Soto 译者 | 张卫滨 策划 | 丁晓昀   为何需要微服务特性? 在微服务架构中,应用程序是由多个相互连接的服务组成的,这些服务协同工作以实现所需的业务功能。 所以,一个典型的企业级微服务架构如下所示: 最初,我们可能认为使用微服务架构实现一个应用程序是很容易的事情。但是,要恰当地完成这一点并不容易,因为我们会面临一些新的挑战,而这些挑战是单体架构所未曾遇到的。举例来讲,这样的挑战包括容错、服务发现、扩展性、日志和跟踪等。 为了应对这些挑战,每个微服务都需要实现在 R
深度学习与Python
2023/04/01
1.9K0
如何借助 Quarkus 和 MicroProfile 实现微服务
没有任何类型 Windows 的外层实例可访问---Java内部类与外类型
Java内部类与外部类 错误提示: 没有任何类型 TestThread 的外层实例可访问。必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配。 public class CarTest { public class Car{ String engine; String Wheel; public void run(){ System.out.println("汽车在奔跑"); } } /
似水的流年
2018/01/18
1.5K0
java之方法的参数传递(值传递和引用传递)
基础数据类型参数传递方式只有一种:值传递。即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响;
西西嘛呦
2020/08/26
2.1K0
辨析Java方法参数中的值传递和引用传递
小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示。
翎野君
2023/05/12
1.5K0
辨析Java方法参数中的值传递和引用传递
java中,方法参数是基本类型和引用类型的区别
当参数是基本类型时,在调用方法时将值传递到方法中,运行方法,运行结束方法退出,对原本main中定义的变量没有任何操作(方法中没有return)。即:此时只跟栈有关系,方法执行完之后(方法中没有return),会弹栈。
黑泽君
2018/11/07
1.5K0
java基本变量和引用变量_引用类型与值类型的区别
Java中数据类型分为两大类:基本数据类型与复合数据类型。相应地,变量也有两种类型:基本类型与引用类型。
全栈程序员站长
2022/11/01
2K0
Java线程封闭
将ThreadLocal变量定义成private static的,这样的话ThreadLocal的生命周期就更长,由于一直存在ThreadLocal的强引用,所以ThreadLocal也就不会被回收,也就能保证任何时候都能根据ThreadLocal的弱引用访问到Entry的value值,然后remove它,防止内存泄露。
开源日记
2021/01/26
5080
从API源码看API经济 | 从开发角度看应用架构13
前言 本文仅代表作者的个人观点; 本文的内容仅限于技术探讨,不能作为指导生产环境的素材; 本文素材是红帽公司产品技术和手册; 本文分为系列文章,将会有多篇,初步预计将会有26篇。 本篇参考文献: ht
魏新宇
2018/07/30
1.6K0
从API源码看API经济 | 从开发角度看应用架构13

相似问题

RLMRealm(path:)参数标签'(path:)‘与任何可用的重载都不匹配

10

提供的参数与任何类型的目标都不匹配

01

Git: pathspec 'path‘与git已知的任何文件都不匹配

10

类型/值与模板的参数不匹配

10

使用POST方法的Java @Pathparam

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文