需要使用XSLT使用文件夹名称和标题创建文件名

时间:2017-02-06 11:01:18

标签: json xml xslt

我想创建链接,使用文件夹名称和文件名以及hypen符号。如果我的文件夹名称包含items / item.xsl,

我的输入XML是:

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

XSL我在文件夹名称(/ items)中用作(item.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链接,其中表示文件夹名称, Management-Plan 表示输入文件中的文本名称。在文本名称空间之间填充输出中的hypen符号。

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

2 个答案:

答案 0 :(得分: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,'/')">

价值是例如(&#34;路径&#34;&#34;至&#34;&#34;项目&#34;&#34; items.xsl&#34)

文件夹名称是第二个最后一个组件:

<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>

答案 1 :(得分:0)

您应该添加根模板:

<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>

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