2016-02-18 30 views
-2

有一个XML文件。粗略地说,它看起来是这样的:XSLT转换

<DOCUMENT> 
    ....... 
    <CONTENT> 
    ...... 
    <PHASE> 
     ...... 
     <INSTRUCTION> 
     ...... 
     <VALUE><![CDATA[<script LANGUAGE="JavaScript" type="text/javascript"> 
     arrayTitle = arrayTitle.concat([ 
     ["Выбор", "Выбор партии"], 
     ["Всего на складе участка", "Всего на&nbspскладе участка"], 
     ["№ технолог. серии", "№&nbspтехнолог. серии"], 
     ["Подпись исполнителя /мастера", "Подпись&nbspисполнителя/ Подпись&nbspмастера"], 
     ["Последн смена (последн расход)", "Последнее списание в&nbspсерии"] 
     ]);</script>]]> 
     </VALUE> 
     ...... 

     </INSTRUCTION> 
     ...... 
    </PHASE> 
    ...... 
    </CONTENT> 
...... 
<DOCUMENT> 

我需要使出浑身XSLT和脚本存在于一个XML文件的形式:

<dict> 
    <trans key="Выбор" value="Выбор партии" /> 
    <trans key="Всего на складе участка" value="Всего на складе участка" /> 
    <trans key="Ед.изм." value="Единицы измерения" /> 
    <trans key="№ технолог. серии" value="№ технолог. серии" /> 
    <trans key="Подпись исполнителя /мастера" value="Подпись исполнителя/ Подпись мастера" /> 
    <trans key="Последн смена (последн расход)" value="Последнее списание в серии" /> 
</dict> 
+1

Stackoverflow不是“为我写代码”网站。请向我们展示您拥有的XSLT,我们会尽力为您提供帮助。 –

+0

XML文件非常大。 3000行 –

+0

当前XSLT完成的XML摘录足以形成一个连贯的问题。 – zx485

回答

1

这里是一个XSLT 3.0样式表与撒克逊测试9.7 EE,它使用XPath 3.1中的analyze-string函数,parse-json function,然后使用新的array type

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="3.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:array="http://www.w3.org/2005/xpath-functions/array" 
    exclude-result-prefixes="xs fn array"> 

<xsl:output indent="yes"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="DOCUMENT/CONTENT/PHASE/INSTRUCTION/VALUE"/> 
</xsl:template> 

<xsl:template match="VALUE"> 
    <dict> 
    <xsl:apply-templates select="analyze-string(., '\[.*\]', 's')//fn:match/parse-json(.)?*"/> 
    </dict> 
</xsl:template> 

<xsl:template match=".[. instance of array(xs:string)]"> 
    <trans key="{.?1}" value="{.?2}"/> 
</xsl:template> 

</xsl:stylesheet> 

它把输入

<DOCUMENT> 
    ....... 
    <CONTENT> 
    ...... 
    <PHASE> 
     ...... 
     <INSTRUCTION> 
     ...... 
     <VALUE><![CDATA[<script LANGUAGE="JavaScript" type="text/javascript"> 
     arrayTitle = arrayTitle.concat([ 
     ["Выбор", "Выбор партии"], 
     ["Всего на складе участка", "Всего на&nbspскладе участка"], 
     ["№ технолог. серии", "№&nbspтехнолог. серии"], 
     ["Подпись исполнителя /мастера", "Подпись&nbspисполнителя/ Подпись&nbspмастера"], 
     ["Последн смена (последн расход)", "Последнее списание в&nbspсерии"] 
     ]);</script>]]> 
     </VALUE> 
     ...... 

     </INSTRUCTION> 
     ...... 
    </PHASE> 
    ...... 
    </CONTENT> 
...... 
</DOCUMENT> 

到结果

<?xml version="1.0" encoding="UTF-8"?> 
<dict> 
    <trans key="Выбор" value="Выбор партии"/> 
    <trans key="Всего на складе участка" value="Всего на&amp;nbspскладе участка"/> 
    <trans key="№ технолог. серии" value="№&amp;nbspтехнолог. серии"/> 
    <trans key="Подпись исполнителя /мастера" 
      value="Подпись&amp;nbspисполнителя/ Подпись&amp;nbspмастера"/> 
    <trans key="Последн смена (последн расход)" 
      value="Последнее списание в&amp;nbspсерии"/> 
</dict> 

要与开源撒克逊9.7使用相同的方法HE,我们可以使用

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="3.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:array="http://www.w3.org/2005/xpath-functions/array" 
    exclude-result-prefixes="xs fn array"> 

<xsl:output indent="yes"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="DOCUMENT/CONTENT/PHASE/INSTRUCTION/VALUE"/> 
</xsl:template> 

<xsl:template match="VALUE"> 
    <dict> 
    <xsl:for-each select="analyze-string(., '\[.*\]', 's')//fn:match/parse-json(.)?*"> 
     <tans key="{.?1}" value="{.?2}"/> 
    </xsl:for-each> 
    </dict> 
</xsl:template> 

</xsl:stylesheet> 
+0

你很酷。非常感谢 –