我刚刚创建了一个XSL转换,我将Xml转换为xHTML并返回。这是我第一次使用XSLT。现在我正在构建一个反向转换的“后部”,我陷入困境。
简介/概述
所以基础XML包含我正在寻找的两个节点(frags):
<frag id="10" name="Editable_Fragment" >
<child id="11"></child>
</frag>
<frag id="20" name="Editable_Fragment2">
<child id="21"></child>
</frag>
顺便说一句,这个XML中有很多片段,但我只是在寻找“可编辑”的片段!所以我创建了一个像这样的XSLT:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="/review-case/review-document/review-channel/content/region/section/frag[@name='Editable_Fragment']/node()"/>
<xsl:apply-templates select="/review-case/review-document/review-channel/content/region/section/frag[@name='Editable_Fragment2']/node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
两个节点的内容作为字符串在富文本编辑器中保存在一起!内容如下所示:
<child id="11" name="Editable_Fragment">....data...</child>
<child id="21" name="Editable_Fragment">....data...</child>
在富文本编辑器中,我正在更改两个节点的一些数据,之后我想用所谓的反向转换来更新数据。
逆转换问题
带有“child”标签的字符串将用于参数 mpTransformParameters 中的进一步处理。我必须使用此参数。我知道使用以下XSLT代码我只是使用child id =“11”和child id =“21”更新frag id =“10”。
我的问题是,如何将更新的子id =“11”合并回“frag id = 10”和 child id =“21 to”frag id = 20“如果两者都在字符串中?
“反向”XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:param name="mpTransformParameters"/>
<xsl:template match="review-case/review-document/review-channel/content/region/section/frag/child[@name='Editable_Fragment']">
<xsl:value-of select="$mpTransformParameters" disable-output-escaping="yes"/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
非常感谢
答案 0 :(得分:0)
试试这样的XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="mpTransformParameters">
<child id="11" name="Editable_Fragment">..data 11..</child>
<child id="21" name="Editable_Fragment">..data 22..</child>
</xsl:param>
<xsl:template match="section">
<xsl:variable name="tbl"
select="tokenize($mpTransformParameters, '</child>')"/>
<xsl:copy>
<xsl:for-each select="$tbl">
<xsl:analyze-string select="."
regex="id="(\d+)".*>(.*)">
<xsl:matching-substring>
<xsl:variable name="id" select="number(regex-group(1)) - 1"/>
<xsl:variable name="txt" select="regex-group(2)"/>
<xsl:variable name="nm">
<xsl:if test="$id=10"><xsl:text>Editable_Fragment</xsl:text></xsl:if>
<xsl:if test="$id=20"><xsl:text>Editable_Fragment2</xsl:text></xsl:if>
</xsl:variable>
<xsl:element name="frag">
<xsl:attribute name="id" select="$id"/>
<xsl:attribute name="name" select="$nm"/>
<xsl:value-of select="$txt"/>
</xsl:element>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>
我故意选择 XSLT 2.0 ,因为它太繁琐了 在版本 1.0 中写下它。
出于测试运行的目的,我为 mpTransformParameter 分配了一个样本值。
我准备了略微简化的XML输入,其中包含 section 元素的虚拟内容,正如您所写,实际内容位于 mpTransformParameters :
<region>
<section>Dummy content
</section>
</region>
使用它,我得到以下结果:
<region>
<section>
<frag id="10" name="Editable_Fragment">..data 11..</frag>
<frag id="20" name="Editable_Fragment2">..data 22..</frag>
</section>
</region>