有一个XML文件。粗略地说它看起来像这样:
<DOCUMENT>
.......
<CONTENT>
......
<PHASE>
......
<INSTRUCTION>
......
<VALUE><![CDATA[<script LANGUAGE="JavaScript" type="text/javascript">
arrayTitle = arrayTitle.concat([
["Выбор", "Выбор партии"],
["Всего на складе участка", "Всего на складе участка"],
["№ технолог. серии", "№ технолог. серии"],
["Подпись исполнителя /мастера", "Подпись исполнителя/ Подпись мастера"],
["Последн смена (последн расход)", "Последнее списание в серии"]
]);</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>
答案 0 :(得分:1)
以下是使用Saxon 9.7 EE测试的XSLT 3.0样式表,它使用了analyze-string
函数,parse-json
function,然后使用了XPath 3.1中的新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([
["Выбор", "Выбор партии"],
["Всего на складе участка", "Всего на складе участка"],
["№ технолог. серии", "№ технолог. серии"],
["Подпись исполнителя /мастера", "Подпись исполнителя/ Подпись мастера"],
["Последн смена (последн расход)", "Последнее списание в серии"]
]);</script>]]>
</VALUE>
......
</INSTRUCTION>
......
</PHASE>
......
</CONTENT>
......
</DOCUMENT>
进入结果
<?xml version="1.0" encoding="UTF-8"?>
<dict>
<trans key="Выбор" value="Выбор партии"/>
<trans key="Всего на складе участка" value="Всего на&nbspскладе участка"/>
<trans key="№ технолог. серии" value="№&nbspтехнолог. серии"/>
<trans key="Подпись исполнителя /мастера"
value="Подпись&nbspисполнителя/ Подпись&nbspмастера"/>
<trans key="Последн смена (последн расход)"
value="Последнее списание в&nbspсерии"/>
</dict>
要使用与开源Saxon 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>