【问题标题】:Need to create the file name by using folder name and title using XSLT需要使用 XSLT 使用文件夹名称和标题来创建文件名
【发布时间】:2017-06-23 07:11:20
【问题描述】:

我想通过使用文件夹名称以及带有连字符的文件名来创建链接。如果我的文件夹名称包含 items/item.xsl,

我的输入 XML 是:

<Settings>
<code>MGT</code>
<url>http://tneb.com</url>
</Settings>
<page/>
<counter>
<enabled>true</enabled>
<text>Management Plan</text>
</counter>

我在文件夹名称(/items)中用作(item.xsl)的XSL:

<xsl:stylesheet version="3.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:json="http://json.org/" xmlns:mf="http://example.com/mf" exclude-result-prefixes="#all">

<xsl:template match="Settings">
"Settings": {
<xsl:apply-templates/>
},
</xsl:template>

<xsl:template match="code">
"code": "<xsl:apply-templates/>",
</xsl:template>

<xsl:template match="url">
"url": "<xsl:apply-templates/>",
</xsl:template>

<xsl:template match="page"/>

<xsl:template match="counter">
"counter": {
<xsl:apply-templates/>
},
</xsl:template>

<xsl:template match="enabled">
"enabled": "<xsl:apply-templates/>",
</xsl:template>

<xsl:template match="text">
"text": "<xsl:apply-templates/>" ,
</xsl:template>

</xsl:stylesheet>

我得到的 Json 输出为:

"Settings": {

"code": "MGT",

"url": "http://tneb.com",

},

"counter": {

"enabled": "true",

"text": "Management Plan ", 

},

但我需要在设置和计数器文件夹之间创建一个 pdf 链接,如下所示:

"Settings": {

"code": "MGT",

"url": "http://tneb.com",

},
pdf: 'files/items-Management-Plan.pdf',

"counter": {

"enabled": "true",

"text": "Management Plan ", 

},

我需要创建 pdf 链接,其中 items 表示文件夹名称,Management-Plan 表示输入文件中的文本名称。在输出中文本名称的空格之间用连字符符号填充。

请就此提出建议。提前致谢。

【问题讨论】:

  • 你的第一个 sn-p 有一个不匹配的&lt;/trackingSettings&gt;,所以它不是 XML。第二个“JSON”输出有一个未引用的 pdf 属性名称,所以它不是 JSON。至于创建 JSON,您在样式表中使用了 version="3.0",如果您真的使用该版本,那么有更好的方法来构造 JSON,因为 XSLT/XPath 3.0/3.1 具有映射和数组,并且可以将它们序列化为 JSON。
  • 现在我编辑了@MartinHonnen。除了 json 输出之外,使用 XSLT 进行正常转换是否可以做到这一点
  • 考虑向我们展示包含Settings 和counter 元素的父元素。为此,您可以编写一个模板,例如&lt;xsl:apply-templates select="Settings"/&gt;, "pdf" : "files/items-Management-Plan.pdf", &lt;xsl:apply-templates select="counter"/&gt;.

标签: json xml xslt


【解决方案1】:

获取样式表的URI作为变量:

<xsl:variable name="stylesheet-uri" as="xs:string" select="base-uri(document(''))"/>

值是例如/path/to/items/items.xsl

然后将其拆分为路径组件:

<xsl:variable name="uri-components" as="xs:string+" select="tokenize($stylesheet-uri,'/')">

值是例如("path","to","items","items.xsl")

文件夹名称是倒数第二个组件:

<xsl:variable name="folder" as="xs:string" select="$uri-components[count($uri-components) - 1]"/>

PDF 名称的第二部分是文本元素的值,其中空格字符替换为连字符:

<xsl:variable name="PDF-name-part" as="xs:string" select="translate(//text/text(), ' ', '-')"/>

最后,将这些位放在设置模板的末尾:

<xsl:template match="Settings">
  "Settings": {
    <xsl:apply-templates/>
  },

  "pdf:" "<xsl:value-of select="concat('files/',$folder,'-',$PDF-name-part,'.pdf')"/>"

</xsl:template>

【讨论】:

    【解决方案2】:

    你应该添加一个根模板:

    <xsl:template match="/">
        <xsl:variable name="filename" select="replace(counter/text, ' ', '-')" />
    
        <xsl:apply-templates select="Settings" />
    
        <!-- The new PDF line -->
        <xsl:text>"pdf": </xsl:text>
        <xsl:value-of select="concat( '&quot;', 'files/items-', $filename, '.pdf', '&quot;', ',&#xA;' )" />       
    
        <xsl:apply-templates select="Counter" />
    </xsl:template>
    

    这会在您的设置和计数器输出之间添加所需的行。

    【讨论】:

    • 谢谢@SomeStupid。
    猜你喜欢
    • 2019-03-14
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多