2014-11-21 45 views
2

我需要更改某些節點的文本,類似於Update the text of an element with XSLT based on paramXslt:如何使用參數更改元素中的節點文本

這是我的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<TEI xmlns="http://www.tei-c.org/ns/1.0"> 
    <teiHeader> 
     <fileDesc> 
      <titleStmt> 
       <title /> 
      </titleStmt> 
      <publicationStmt> 
       <p /> 
      </publicationStmt> 
      <sourceDesc> 
       <p /> 
      </sourceDesc> 
     </fileDesc> 
     <encodingDesc> 
      <appInfo> 
       <application ident="TEI_fromDOCX" version="2.15.0"> 
        <label>DOCX to TEI</label> 
       </application> 
      </appInfo> 
     </encodingDesc> 
     <revisionDesc> 
      <change> 
       <date>$LastChangedDate: 2014-10-19$</date> 
      </change> 
     </revisionDesc> 
    </teiHeader> 
    <text> 
     <body xml:id="test"> 
      <head>DICTIONARY</head> 
      <entry> 
       <form type="hyperlemma" xml:lang="cu"> 
        <orth>абиѥ</orth> 
       </form> 
       <form type="lemma" xml:lang="cu"> 
        <orth>абиѥ</orth> 
       </form> 
       <form type="variant" xml:lang="cu"> 
        <orth>а̓бїе</orth> 
        <form type="hyperlemma" xml:lang="cu"> 
         <orth>а̓бїе</orth> 
        </form> 
       </form> 
      </entry> 
     </body> 
    </text> 
</TEI> 

我現在想的<orth>內容在以前的節點

<entry> 
    <form type="hyperlemma" xml:lang="cu"> 
     <orth>абиѥ</orth> 
    </form> 

替換

<form type="variant" xml:lang="cu"> 
    <orth>а̓бїе</orth> 
    <form type="hyperlemma" xml:lang="cu"> 
     <orth>а̓бїе</orth> 
    </form> 
</form> 

<orth>之間的文本爲了得到以下輸出:

<entry> 
    <form type="hyperlemma" xml:lang="cu"> 
     <orth>абиѥ</orth> 
    </form> 
    <form type="lemma" xml:lang="cu"> 
     <orth>абиѥ</orth>  
    </form> 
    <form type="variant" xml:lang="cu"> 
     <orth>а̓бїе</orth> 
     <form type="hyperlemma" xml:lang="cu"> 
      <orth>абиѥ</orth> 
     </form> 
    </form> 
<entry> 

當我使用下面的樣式表

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" xpath-default-namespace="http://www.tei-c.org/ns/1.0" version="2.0"> 
<xsl:output method="xml" indent="yes" /> 
<xsl:strip-space elements="*" /> 

<xsl:param name="replace_orth" select="entry/form[@type='hyperlemma' and @xml:lang='cu']/orth" /> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="form[@type='variant']/form[@type='hyperlemma' and @xml:lang='cu']/orth/text()"> 
    <xsl:value-of select="$replace_orth" /> 
</xsl:template> 
</xsl:stylesheet> 

然後我得到

<form type="variant" xml:lang="cu"> 
    <orth>а̓бїе</orth> 
    <form type="hyperlemma" xml:lang="cu"> 
     <orth/> 
</form> 

所以<orth>是空的。如果我將參數更改爲

<xsl:param name="replace_orth" select="'new orth'" /> 

'new orth'被打印。但是因爲<entry><form type="hyperlemma" xml:lang="cu"><orth>的內容對於每個條目都不相同(在上面的示例XML中,我只顯示一個條目),所以我不能使用「靜態」字符串。

我需要改變什麼?

感謝您的任何提示!

回答

1

問題是您沒有選擇任何與您的xsl:param。您必須指定orth的完整路徑或使用//

<xsl:param name="replace_orth" 
select="/TEI/text/body/entry/form[@type='hyperlemma' and @xml:lang='cu']/orth" /> 

<xsl:param name="replace_orth" 
select="//entry/form[@type='hyperlemma' and @xml:lang='cu']/orth" /> 
+0

非常感謝!這兩個斜線做了詭計,我現在想知道爲什麼我沒有看到我自己...... – smo 2014-11-25 07:30:24

1

您必須從xsl:stylesheet元素中刪除屬性xpath-default-namespace="http://www.tei-c.org/ns/1.0"。默認情況下,該屬性將所提到的uri作爲名稱空間uri應用於xpath中的所有元素。

例如: 如果您運行下面的XML(從你輸入的部分):

<entry> 
<form type="hyperlemma" xml:lang="cu"> 
    <orth>value</orth> 
</form> 
</entry> 

反對這種XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.tei-c.org/ns/1.0" version="2.0"> 
<xsl:output method="text" indent="yes" /> 
<xsl:param name="replace_orth" select="entry/form[@type='hyperlemma' and @xml:lang='cu']/orth" /> 

<xsl:template match="/"> 
    <xsl:value-of select="$replace_orth"/> 
</xsl:template> 
</xsl:stylesheet> 

輸出是什麼。 原因是所有的xpath元素,默認情況下,應該有名稱空間http://www.tei-c.org/ns/1.0。因此,參數replace_orth沒有選擇任何內容,因爲輸入XML沒有任何元素的名稱空間。

但是,如果你改變你的XML輸入以下內容:

<entry xmlns="http://www.tei-c.org/ns/1.0"> 
<form type="hyperlemma" xml:lang="cu"> 
    <orth>value</orth> 
</form> 
</entry> 

輸出將是: value

那是因爲在輸入XML的所有元素的默認命名空間是http://www.tei-c.org/ns/1.0

+0

非常感謝您!我仍然想知道爲什麼提到的屬性會阻止替換''元素的內容。你能解釋一下嗎? – smo 2014-11-23 15:52:28

+0

@smo,請檢查我編輯的答案..它肯定會幫助.. – 2014-11-23 22:54:09

+0

@ LingamurthyCS感謝您的更詳細的答案!我想我現在明白你的意思了。如果我用**和XML來清除'http:// www.tei-c.org/ns/1.0'並運行它,我就會得到,就像你說'價值'一樣。但是,只要''是另一個節點的子節點,我們假設',輸出又是什麼都沒有。這真讓我感到困惑。這仍然與名稱空間有關還是有其他干擾? – smo 2014-11-24 10:09:27